2008-12-15 81 views
0

我有很简单的选择是这样的:mysql的范围指标

SELECT * FROM table 
    WHERE column1 IN (5, 20, 30); 

上COLUMN1是seted指数,经过解释查询索引中使用,一切看起来是好的。

,但如果在距离大于三个值,像这样:不使用

SELECT * FROM table 
     WHERE column1 IN (5, 20, 30, 40); 

指数,并选择运行直通的所有记录。难道我做错了什么?谢谢

回答

2

MySql认为表中有多少行?

Mysql经常(通常是正确的!)假设它会更快地对行进行顺序扫描,而不是混淆通过索引进行更复杂的访问。

它从DBMS到DBMS有所不同,但折中点约为行数的30%。

IE。如果优化器期望选择多于30%的行,它将顺序扫描整个表,因为这通常比通过索引进行大量直接访问要快。

+0

非常真实的是,定期进行计算静态和主要数据更改之后,优化器能够正确地进行决策也是一个不错的主意。 +1 – Dheer 2008-12-15 11:13:15