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

San*_*nan 5 mysql indexing sql-order-by

我正在写一个查询:

select * from table_name order by id limit 21
Run Code Online (Sandbox Code Playgroud)

在我使用限制小于或等于 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 
---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

new*_*ver 6

在一般情况下,要为LIMIT M, NMySQL返回行将必须扫描结果的 M+N 行LIMIT,并跳过其中的前 M-1 行,因此是全表扫描。

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

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