我正在尝试使用EXPLAIN优化此mysql查询。有人可以帮帮我吗?
EXPLAIN SELECT * FROM keyword
WHERE keyword LIKE "panasonic%"
AND keyword != "panasonic"
AND price < 3230 AND price > 3370
ORDER BY price DESC
LIMIT 99
基本上我想找出以“某个关键字”开头但与其完全匹配的关键字,并且在某个特定范围内其价格不。哦,我必须按价格的降序(这导致问题在这里)得到它们。
解释输出:
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:column_names
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
解释输出更改
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 :(得分:3)
在这种情况下哪个查询更好?
在特定的情况下,我希望第一个查询更好。
选项A)拉出以指示关键字开头的~24行并按价格排序(请注意,filesort是一种算法,并不表示排序是在磁盘上完成的) ,
选项B)按价格顺序拉出约100万行并检查它们以查看它们是否符合关键字约束(直到你得到99个)。
话虽如此,如果您的关键字为's'
,或者您的数据不统一,则更好的选项可以反转。无论如何,我认为对于大多数应用来说,选项A)是赢家。
“检查过的行”列是否具有欺骗性?
当然。 EXPLAIN
中检查的行是估计值。最好检查
SHOW SESSION STATUS LIKE 'handler_%'
查看实际拉动的行数。