[英]MYSQL Index on TIMESTAMP field not using index for range query
我在mysql表中有以下行
+--------------------------------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------+----------------------+------+-----+---------+----------------+
| created_at | timestamp | YES | MUL | NULL | |
該字段中存在以下索引
*************************** 6. row ***************************
Table: My_Table
Non_unique: 1
Key_name: IDX_My_Table_CREATED_AT
Seq_in_index: 1
Column_name: created_at
Collation: A
Cardinality: 273809
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
我正在嘗試優化以下查詢以使用IDX_My_Table_CREATED_AT索引作為范圍條件
SELECT * FROM My_Table as main_table WHERE ((main_table.created_at >= '2013-07-01 05:00:00') AND (main_table.created_at <= '2013-11-09 05:59:59'))\G
當我在select查詢中使用EXPLAIN時,我得到以下內容:
+----+-------------+------------+------+---------------------------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------------------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | main_table | ALL | IDX_My_Table_CREATED_AT | NULL | NULL | NULL | 273809 | Using where |
+----+-------------+------------+------+---------------------------------+------+---------+------+--------+-------------+
問題是IDX_My_Table_CREATED_AT索引未用於此范圍條件,即使它是BTREE索引,因此應該適用於查詢。
奇怪的是,如果我在列上嘗試單個值查找,則使用索引。
EXPLAIN SELECT * FROM My_Table as main_table WHERE (main_table.created_at = '2013-07-01 05:00:00');
+----+-------------+------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
| 1 | SIMPLE | main_table | ref | IDX_My_Table_CREATED_AT index | IDX_My_Table_CREATED_AT index | 5 | const | 1 | Using where |
+----+-------------+------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
為什么索引不用於范圍條件? 我已經嘗試更改查詢以使用BETWEEN,但這並沒有改變任何東西。
答案很簡單..
MySQL優化器是基於成本的,優化器計算出全表掃描是獲取記錄的最佳方式(最便宜)。
因為所需的范圍看起來像是查看行(EXPLAIN)和基數的完整表格。 這些數字是平等的。
如果MySQL優化器確實使用索引,相對成本會高得多,因為隨機讀取(慢)查找記錄所需的內容
關於故事的座右銘在這種情況下,完整的表掃描不是世界末日...只是接受它..
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.