我是新來查詢優化,所以我接受我不明白的一切,但我不明白爲什麼即使這個簡單的查詢沒有按預期優化。MySql拒絕使用索引
我的表:
+------------------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-----------+------+-----+-------------------+----------------+
| tasktransitionid | int(11) | NO | PRI | NULL | auto_increment |
| taskid | int(11) | NO | MUL | NULL | |
| transitiondate | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+------------------+-----------+------+-----+-------------------+----------------+
我的指標:
+-----------------+------------+-------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------------+------------+-------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tasktransitions | 0 | PRIMARY | 1 | tasktransitionid | A | 952 | NULL | NULL | | BTREE | | |
| tasktransitions | 1 | transitiondate_ix | 1 | transitiondate | A | 952 | NULL | NULL | | BTREE | | |
+-----------------+------------+-------------------+--------------+------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
我的查詢:
SELECT taskid FROM tasktransitions WHERE transitiondate>'2013-09-31 00:00:00';
給出了這樣的:
+----+-------------+-----------------+------+-------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+------+-------------------+------+---------+------+------+-------------+
| 1 | SIMPLE | tasktransitions | ALL | transitiondate_ix | NULL | NULL | NULL | 1082 | Using where |
+----+-------------+-----------------+------+-------------------+------+---------+------+------+-------------+
如果我理解正確,Using where
和ALL
表示所有行都從存儲引擎中檢索並在服務器層進行過濾。這是次優的。爲什麼它拒絕使用索引,只能從存儲引擎(innoDB)中檢索請求的範圍?
乾杯
你試過強迫索引了嗎? – Kermit
@FreshPrinceOfSO不,但我爲什麼要?我希望預處理器足夠聰明,給定高基數以自動選擇索引。 – Tin
可能因爲索引是無用的。 – Kermit