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