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)
在一般情况下,要为LIMIT M, NMySQL返回行将必须扫描结果的 M+N 行LIMIT,并跳过其中的前 M-1 行,因此是全表扫描。
您的案例中的前 20 行似乎适合单个页面,并且由于您按主键排序,MySQL 可能知道它不需要进行全表扫描。
另一件应该知道的事情,MySQL 通常不使用任何索引进行查询,例如SELECT * FROM T ORDER BY something,通常在有条件的情况下使用索引,或者如果可以直接从索引中获取所有数据(覆盖索引)。
| 归档时间: |
|
| 查看次数: |
4796 次 |
| 最近记录: |