我在写一个查询:
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
---------------------------------------------------------------------------
答案 0 :(得分:3)
一般情况下,要返回LIMIT M, N
MySQL的行,必须扫描没有LIMIT
的结果的M + N行,并跳过它们的第一个M-1,因此全表扫描
您的案例中的前20行似乎适合单个页面,并且由于您按主键排序,MySQL可能会理解它不需要进行全表扫描。
另一件事应该知道,MySQL通常不对SELECT * FROM T ORDER BY something
之类的查询使用任何索引,通常在有条件时使用索引,或者如果所有数据都可以直接从索引中获取(覆盖索引) )。