使用filesort的Mysql取决于LIMIT

Gor*_*ran 5 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

有谁知道如何使用filesort取决于LIMIT以及如何更改此依赖关系?

ype*_*eᵀᴹ 1

来自 MySQL LIMIT 优化

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

另外,是否进行文件排序还可能取决于表中的索引(在两种情况下它们是否相同?)、表中的行数(是否相同?)。

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