2009-08-19 40 views
2

我在大型MySQL表(> 400萬行)中查詢。此查詢用於存儲過程,並按姓氏和其他數字字段進行搜索。當我使用這些搜索參數的不同組合時,我得到了快速結果(介於1到2s之間),但有一些特定值,我得到一個查詢,它需要9s才能在生產網站上返回結果。下面是我得到了EXPLAIN語句:儘管正在使用索引,但很少出現MySQL緩慢查詢

 
id, select_type, table, type, possible_keys, key,  key_len, ref, rows, Extra 
-------------------------------------------- 
1, SIMPLE,  Names, ref, IX_Name,  IX_Name, 17,  const, 3173, Using where 

Surame被聲明爲varchar(40),另一場是無符號的SMALLINT(6)。正在使用的指標是IX_Name它由姓(15),並用名字(10)

的前綴我不知道我能做些什麼來提高性能。上面的EXPLAIN輸出有沒有什麼明顯的錯誤?查詢運行速度很慢,僅在姓氏和其他字段的罕見組合上運行,但它的一致性在於它們始終是相同的慢速查詢。

我試着刪除所有索引並重新創建它們,但是這並沒有解決有問題的查詢。

查詢計劃顯示正在使用的索引和在不同的姓氏(和各種值的其他數值字段)該查詢可以是瞬時的。但是,它不喜歡當我搜索姓氏「Fischer」和一個特定的數值字段值(這是一個特別慢的查詢)。這可能是因爲我的表中有許多「Fischer」匹配的名字? (約3500)。但在這種情況下,可以做些什麼來優化這個查詢?以下是我的表的架構。

namenumber:Primary Key,int,unsigned,not null,auto inc;姓氏:varchar(40); forename:varchar(40); f3:varchar(40); f4:varchar(40); f5:smallint(6),無符號; f6:smallint(6),無符號; f7:varchar(40); f8:varchar(40); f9:smallint(6); f10:varchar(10); f11:tinyint(4); f12:smallint(6),無符號; F13:文本

,我運行的查詢如下:

SELECT namenumber,surname,forename,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13 
FROM names IGNORE INDEX (IX_IGNORE1,IX_IGNORE2,IX_IGNORE3) 
WHERE ((surname = 'fischer')) AND (f12 = 270) 
LIMIT 0,14 

MySQL使用以下指數(IX_Name),它包括以下字段:姓(15),名(10),即姓氏的15個字符前綴和姓氏的10個字符前綴。

對於大多數查詢,這是非常快的,但對於那些罕見,大約需要9秒的成績回報網頁,顯示如上解釋的輸出。

任何想法?

由於提前, TM

回答

1

你有沒有試圖修改僅使用姓的指數IX_Name。索引可能會導致延遲 - 因爲他根據姓氏和名字(這不是查詢的一部分)返回行,只需要實際列內容的一部分 - 這需要時間來計算。

+0

啊我認爲這是一個優勢,你可以使用索引的最左邊的前綴。問題是,我希望能夠處理用戶也輸入姓名時的情況。從來沒有嘗試沒有索引的名字...我會嘗試刪除它並測試,看看它是如何去。感謝您的回覆。 – TMM 2009-08-19 11:11:25