2012-09-27 56 views
0

如何索引以下查詢以避免全表掃描?如何索引以避免全表掃描?

explain SELECT fld1, fld2 FROM tablename WHERE IdReceived > 0; 

+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | tablename  | ALL |IdReceived _idx| NULL | NULL | NULL | 99617 | Using where | 
+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+ 

我已經修改了查詢作爲波紋管,然後我也可以看到排ID2(UNION)會爲全表掃描。

explain SELECT fld1,fld2 FROM tablename WHERE IdReceived=1 UNION SELECT fld1,fld2 FROM tablename WHERE IdReceived>=1; 
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+ 
| id | select_type | table   | type | possible_keys | key   | key_len | ref | rows | Extra  | 
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+ 
| 1 | PRIMARY  | tablename | ref | IdReceived _idx | IdReceived _idx | 4  | const | 8865 |    | 
| 2 | UNION  | tablename | ALL | IdReceived _idx | NULL   | NULL | NULL | 99617 | Using where | 
| NULL | UNION RESULT | <union1,2>  | ALL | NULL   | NULL   | NULL | NULL | NULL |    | 
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+ 
+0

試圖強行統計更新。它*有*適當的索引。查詢計劃員必須確定最好不要使用它。 (另外,IdRecieved列中的值的分佈情況如何?) – 2012-09-27 06:28:43

回答

0

由於您將索引列與常數值進行比較,請儘量避免這種情況。

參考這裏:http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html

而且我建議在FLD1一個non_clustered指數,FLD2使這個查詢更快地執行

+0

該聲明沒有任何意義;它可能會有意義*如果*限定爲*爲什麼*常數值可能導致*不使用索引*。 – 2012-09-27 06:30:09

+0

「由於您將索引列與常量值進行比較,因此表sacn必須存在。」意味着**所有具有常量的查詢都將忽略索引**。 – 2012-09-27 06:31:14

+0

請閱讀上面的鏈接 – AnandPhadke