2012-01-18 65 views
3

我正在写的查询:避免在MySQL全表扫描,同时使用以便通过用限制

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

你确定你有'table_name(id)'的索引吗? – 2012-01-18 11:20:54

+0

你能测试你的这样的查询: select table from table_name order by id limit 21 请加你的问题解释结果和表结构 – motto 2012-01-18 11:25:26

+0

查询速度慢吗?表格有多少行?如果你只有几百行,那么整个扫描“LIMIT 100”就是优化器认为的更快。 – 2012-01-18 11:40:18

回答

1

在一般的情况下,返回行用于LIMIT M, N MySQL将必须扫描的结果的M + N行,而不LIMIT,并跳过第M-1其中,因此全表扫描。

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

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

+0

感谢您的信息。在这种情况下是否有其他限制扫描的方式。 – 2012-01-21 09:22:50