使用order by with limit时避免mysql中的全表扫描

使用order by with limit时避免mysql中的全表扫描,mysql,indexing,sql-order-by,Mysql,Indexing,Sql Order By,我正在写一个问题: select * from table_name order by id limit 21 在我使用限制小于或等于20之前,扫描的行等于精确获取的行(例如,如果限制为10,则扫描的行也仅为10)。如果限制超过20,则表格将被完全扫描 仅为主键id创建的一个索引。在这种情况下,有人能说出全表扫描的原因吗 我的桌子有1099行 Explain Result: -----------------------------------------------------------

我正在写一个问题:

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 
---------------------------------------------------------------------------

在一般情况下,要返回
限制M的行,N
MySQL必须扫描结果中的M+N行,而不使用
限制
,并跳过其中的第一个M-1行,从而进行全表扫描

您案例中的前20行似乎适合一个页面,而且由于您是按主键排序的,MySQL可能理解它不需要进行完整的表扫描


另一件事我们应该知道,MySQL通常不使用任何索引来进行查询,比如
SELECT*fromtorderbysomething
,索引通常在有条件时使用,或者如果所有数据都可以直接从索引中获取(覆盖索引)

你确定你在
表名(id)
上有索引吗?你能这样测试你的查询吗:按id限制21从表名顺序中选择id,并请添加到你的问题中解释结果和表结构查询速度慢吗?这个表有多少行?如果您只有几百行,那么优化器认为对
LIMIT 100
进行完整扫描更快。请提供您的表格结构。请不要将回复作为答案发布,如果您想添加更多信息,请编辑您的问题,或者在收到的答案下留下评论。感谢您提供的信息。在这种情况下,有没有其他方法来限制扫描。嗨@newtovar,你能看看我的问题吗?这与你的答案有关,我在条款中使用了索引列,但得到了相同的扫描问题。这里是链接