[英]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.