繁体   English   中英

使用带限制的 order by 时避免 mysql 中的全表扫描

[英]Avoid full table scan in mysql while using order by with limit

我正在写一个查询:

select * from table_name order by id limit 21

在我使用限制小于或等于 20 之前,扫描的行等于确切的获取行(例如,如果限制为 10,则扫描的行也只有 10)。 如果限制超过 20,则表将被完全扫描。

仅为主键 id 创建的唯一一个索引。 在这种情况下,任何人都可以说出全表扫描的原因吗?


我的表有 1099 行。

Explain Result:
---------------------------------------------------------------------------
id|selecttype|table |type|possiblekeys|keys|key_len|ref |rows|  Extra       
---------------------------------------------------------------------------
1 | SIMPLE   |tablen|ALL |  null      |null|null   |null|1099|Usingfilesort 
---------------------------------------------------------------------------

在一般情况下,要返回LIMIT M, N MySQL 将不得不扫描 M+N 行没有LIMIT的结果,并跳过其中的前 M-1 行,因此是全表扫描。

您的案例中的前 20 行似乎适合单个页面,并且由于您按主键排序,MySQL 可能明白它不需要进行全表扫描。

另一件应该知道的事情,MySQL 通常不使用任何索引进行查询,例如SELECT * FROM T ORDER BY something ,索引通常在有条件时使用,或者如果所有数据都可以直接从索引中获取(覆盖索引) .

当您的主键id增加 1 时,您应该能够使用WHERE子句执行以下查询,以基于id获取数据,而不是使用LIMIT进行全表扫描。

SELECT * FROM table_name WHERE id BETWEEN 0 AND 21 ORDER BY id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM