我有一個表,這是大約200萬行(115 MB),它是關於要大得多。當在桌面上運行一些實用程序腳本時,我發現我的一個查詢需要很長時間(15+秒),而幾乎相同的查詢在之前不到半秒。下面是查詢:
查詢1:
SELECT `id` FROM `my_table` WHERE `my_column`='test' ORDER BY `id` LIMIT 28000, 1000
Execution time: 0.204 seconds
查詢2:
SELECT `id` FROM `my_table` WHERE `my_column`='test' ORDER BY `id` LIMIT 29000, 1000
Execution time: 10.203 seconds
索引和表信息
id
是一個主鍵,my_column
也索引(雖然目前它的基數我只有S1)
• ID是一個int
• my_column是一個varchar(50)
查詢解釋
查詢1:類型:索引,possible_keys :my_column,key:PRIMARY,key_len:4,行:29000,額外:使用其中
問題2:類型:範圍,possible_keys:my_column,鍵:my_column,key_len:行 :2,139,123 額外:使用where;使用filesort
正如你可以看到第二個查詢使用my_column
鍵和文件並永久使用,但我所做的只是將極限偏移量增加1,000。
如何暫時解決了這一問題
1)如果我刪除WHERE my_column = 'test'
條件MySQL優化正確使用主鍵進行排序,但我不能刪除這個條件,因爲很快會有其他在my_column
中我需要爲這個查詢過濾掉這些值。 2)如果我使用FORCE INDEX (PRIMARY)
,mysql優化器也會使用正確的索引,但這似乎是一種破解。
我的問題
究竟爲什麼mysql的選擇使用my_column
指數,而不是主鍵的?有沒有更好的方法來處理這個在表定義,索引或我的查詢結構?
嘆息......我只是喜歡愚蠢的疏忽。感謝您的幫助 – Jeff 2012-02-08 21:53:46