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 |             | 
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+
4

1 に答える 1

0

インデックス付きの列を定数値と比較しているので、それを避けるようにしてください。

ここを参照してください:http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html

また、このクエリの実行を高速化するために、fld1、fld2の非クラスター化インデックスをお勧めします

于 2012-09-27T06:19:37.293 に答える