簡體   English   中英

TIMESTAMP字段上的MYSQL索引不使用索引進行范圍查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM