使用order by with limit时,避免在mysql中进行全表扫描

时间:2012-01-18 11:17:06

标签: mysql indexing sql-order-by

我在写一个查询:

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

1 个答案:

答案 0 :(得分:3)

一般情况下,要返回LIMIT M, N MySQL的行,必须扫描没有LIMIT的结果的M + N行,并跳过它们的第一个M-1,因此全表扫描

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

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