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_%'

看你是实际上拉动多少行。