在查询优化中更喜欢什么:使用filesort或更多行进行检查

时间:2010-09-17 03:52:59

标签: mysql sql-order-by query-optimization sql-like sql-execution-plan

我正在尝试使用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”已经消失。

在这种情况下哪个查询更好? “行检查”栏可以具有欺骗性吗?

此致

1 个答案:

答案 0 :(得分:3)

  

在这种情况下哪个查询更好?

特定的情况下,我希望第一个查询更好

选项A)拉出以指示关键字开头的~24行并按价格排序(请注意,filesort是一种算法,并不表示排序是在磁盘上完成的) ,

选项B)按价格顺序拉出约100万行并检查它们以查看它们是否符合关键字约束(直到你得到99个)。

话虽如此,如果您的关键字为's',或者您的数据不统一,则更好的选项可以反转。无论如何,我认为对于大多数应用来说,选项A)是赢家。

  

“检查过的行”列是否具有欺骗性?

当然。 EXPLAIN中检查的行是估计值。最好检查

之类的输出

SHOW SESSION STATUS LIKE 'handler_%'

查看实际拉动的行数。