使用filesort的Mysql取决于LIMIT

时间:2011-03-18 15:51:16

标签: mysql

我有这个问题:

SELECT * 
FROM `content` AS `c` 
WHERE c.module = 20 
  AND c.categoryID 
    IN ('50', '31', '16', '10') 
ORDER BY `c`.`released` DESC 
LIMIT 5

......我有两台机器。在LIMIT小于3时,在第一台机器上,EXPLAIN查询返回“使用where”作为额外字段。当LIMIT大于3时,它返回'Using where;使用filesort'(filesort运行的限制大于3)。

在另一台机器上,对于相同的DB和相同的查询,它是不同的:当LIMIT大于60时,运行filesort。

在两台机器上,my.cnf都一样!!!

有谁知道如何使用filesort依赖于LIMIT以及如何更改这种依赖?

2 个答案:

答案 0 :(得分:1)

来自MySQL LIMIT Optimization

  • 如果您使用LIMIT选择只有几行,MySQL在某些情况下会使用索引,而通常情况下它会更喜欢进行全表扫描。
  • 如果对LIMIT row_count使用ORDER BY,MySQL会在找到排序结果的第一行row_count后立即结束排序,而不是对整个结果进行排序。如果使用索引完成排序,则速度非常快。如果必须完成 filesort ,则必须选择与没有LIMIT子句的查询匹配的所有行,并且必须先对它们中的大部分或全部进行排序,然后才能确定第一个已找到row_count行。在任何一种情况下,在找到初始行之后,就不需要对结果集的任何其余部分进行排序,而MySQL也不会这样做。

另外,不管文件是否也可以,还可能依赖于表中的索引(在两种情况下它们是否相同?),表中的行数(是否相同?)。

关于my.cnf的一个注释。这可能是相同的,但两台机器的内存量相同? MySQL可能无法在两者中使用相同数量的内存。

答案 1 :(得分:1)

  

有谁知道如何使用filesort依赖于LIMIT以及如何更改这种依赖?

在查询中使用ORDER BY时,MySQL应决定如何对输出进行排序。

它可以扫描表格并对结果进行排序,也可以扫描ORDER BY列上的索引。在后一种情况下,不需要排序,但应对从索引中检索的每个记录进行额外的表查找。

由于表查找,索引扫描的费用大约是表扫描的10倍。

这意味着只有当需要扫描记录少于10%(或由于分类开销而多一点)时,才会首选索引扫描。

如果使用LIMIT 3,则限制要扫描的记录数,并且索引扫描将成为更优选的方式。