我有这个问题:
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以及如何更改这种依赖?
答案 0 :(得分:1)
来自MySQL LIMIT Optimization:
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
,则限制要扫描的记录数,并且索引扫描将成为更优选的方式。