2

我想優化這個MySQL查詢使用EXPLAIN。有人可以幫我出來嗎?什麼偏好查詢優化:使用filesort或更多的行檢查

EXPLAIN SELECT * FROM keyword 
WHERE keyword LIKE "panasonic%" 
AND keyword != "panasonic" 
AND price < 3230 AND price > 3370 
ORDER BY price DESC 
LIMIT 99 

基本上我想找出它與「某些關鍵字」開始,但不完全匹配它,其價格爲在一些特定的範圍不的關鍵字。哦,我必須按價格降序排列(這是導致問題的原因)。

explain輸出:

id: 1 
select_type: SIMPLE 
table: keyword 
type: range 
possible_keys: PRIMARY, keyword_price, price_keyword 
key: keyword_price 
key_len: 765 
ref: NULL 
rows: 24 
Extra: Using where; Using filesort 

指標 KEY_NAME的欄

PRIMARY: keyword 
keyword_price: keyword, price 
price_keyword: price, keyword 

現在,如果我放棄使用索引提示,並更改查詢

EXPLAIN SELECT * FROM keyword USE INDEX (price_keyword) 
WHERE keyword LIKE "panasonic%" 
AND keyword != "panasonic" 
AND price < 3230 AND price > 3370 
ORDER BY price DESC 
LIMIT 99 

explain輸出更改爲

id: 1 
select_type: SIMPLE 
table: keyword 
type: index 
possible_keys: price_keyword 
key: price_keyword 
key_len: 790 
ref: NULL 
rows: 1043044 (WHAT THE ????) 
Extra: Using where 

解釋輸出顯示行數成倍增加,但「使用filesort」已消失。

在這種情況下哪種查詢更好?那個「行檢查」欄可以欺騙嗎?

問候

+0

「和價格<3230和價格> 3370」。應該不是「AND(價格<3230或價格> 3370)」 – Jaydee 2010-09-17 08:36:24

+0

@Jaydee - 對。其實我用的不是和。 – vikmalhotra 2010-09-17 09:42:50

+0

做了改變,影響查詢優化? – Jaydee 2010-09-17 09:55:33

回答

3

哪個查詢是在這種情況下更好?

在這種具體情況下,我希望先查詢要更好

選項A)拉〜24行與指定的關鍵字開始,並通過價格排序它們(注意,文件排序是一種算法,並不表明排序是在磁盤上進行),

選項B)按價格順序拉〜100萬行並檢查它們是否符合關鍵字約束(直到您獲得99個)。

話雖如此,如果您的關鍵字是's',或者您的數據不統一,更好的選項可能會相反。無論如何,我認爲對於大多數應用來說,選項A)是勝利者。

那個「行檢查」列是否有欺騙性?

當然。 EXPLAIN中檢查的行是估計值。最好檢查一下的東西輸出像

SHOW SESSION STATUS LIKE 'handler_%'

看你是實際上拉動多少行。

相關問題