2012-04-14 42 views
4

我有一個〜100GB的MySQL表,有近10億行。它只有8列,其中之一是一個索引日期時間,用於大多數查找通過細分「BETWEEN」查詢。大型MySQL表 - 索引打破

以前我對這個專欄的索引效果很好......但隨着表格的不斷增長,突然間索引剛停止工作。現在,EXPLAIN顯示了在所有查詢中使用「filesort」,並且我已經提出了所有適用於內存池的my.conf值都無濟於事。

有一個關鍵什麼可以處理的最大值?像分區會解決這個問題嗎?

任何有識之士將不勝感激。謝謝!

+0

有多少表中的行試試?你使用什麼引擎? InnoDB或MyISAM? – Qualcuno 2012-04-14 14:52:17

+0

我在第一句話中說 - 近10億行。這是MyISAM。謝謝! – Harry 2012-04-14 15:10:51

+0

您的索引是否適合內存?顯示您的表格狀態和'key_buffer_size' – jordeu 2012-04-14 16:50:49

回答

2

如果你有能力,停止MySQL服務器,然後去你的數據文件夾,並執行

myisamchk -r <table_name> 

myisamchk -r -v -f <table_name> 

應該修復你的表。你也可以用

REPAIR TABLE <table_name> 

更多信息herehere

+0

哇,真的那麼簡單 - 我不敢相信我沒有嘗試過。非常感謝你的幫助! – Harry 2012-04-14 21:43:20

1

您可以嘗試強制索引使用提示。 結帳 the mysql page explaining the index hints。一個非常快速的例子是;

SELECT * FROM table1 USE INDEX (col1_index) 
    WHERE col1 BETWEEN date1 AND date2; 

但我不認爲這是你的主要問題。爲了預見未來可能出現的問題,我強烈建議您仔細閱讀 MySQL Resource Limits Excerpt

在某些方面,它聲明:

If you do encounter a full-table error, there are several reasons why it might have occurred: 
... 
You are using MyISAM tables on an operating system that supports files only up to 2GB in size and you have hit this limit for the data file or index file. 

似乎並非如此。但在這一點上你可能會考慮一些可能性。

我還強烈建議您快速搜索關鍵字'myisampack'。