MySQL 无法识别 WHERE 中的日期时间索引

标签 mysql sql datetime indexing

我想做的是索引一个人的名字和他们的出生日期。

表格是这样布置的:

CREATE TABLE test
(
 id INT NOT NULL AUTO_INCREMENT,
 fname VARCHAR(10) NOT NULL,
 sname VARCHAR(10) NOT NULL,
 age INT NOT NULL,
 born DATETIME NOT NULL,

 PRIMARY KEY(id),
 INDEX name_age(fname, sname, age),
 INDEX name_date(fname, born)
)

然而,在这样的 where 语句中无法识别索引:

mysql> EXPLAIN SELECT * 
    -> FROM  `test` 
    -> WHERE fname =  "coby"
    -> AND born
    -> BETWEEN  "1900-05-02 06:23:00"
    -> AND  "2100-05-02 06:23:00";
+----+-------------+-------+------+--------------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys      | key      | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+--------------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | test  | ref  | name_age,name_date | name_age | 12      | const |   45 | Using where |
+----+-------------+-------+------+--------------------+----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

但是它在 order by 语句中被识别:

mysql> EXPLAIN SELECT * 
    -> FROM  `test` 
    -> WHERE fname =  "coby"
    -> ORDER BY born;
+----+-------------+-------+------+--------------------+-----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys      | key       | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+--------------------+-----------+---------+-------+------+-------------+
|  1 | SIMPLE      | test  | ref  | name_age,name_date | name_date | 12      | const |   45 | Using where |
+----+-------------+-------+------+--------------------+-----------+---------+-------+------+-------------+
1 row in set (0.00 sec)

如何使索引在 where 语句中被识别?

如有任何帮助,我们将不胜感激。

最佳答案

索引识别,如第一个EXPLAIN 语句结果的possible_keys 列所示。碰巧的是,对于 45 行,另一个索引生成了一个相同或更好的查询计划:您的日期范围的选择性接近于零。

ORDER BY 是另一双鞋:当您不仅使用索引进行选择,还用于排序时,它现在变得有用了。

关于MySQL 无法识别 WHERE 中的日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20909789/

相关文章:

java - 读取文件时java中的日期和时间转换

mysql - SQL 返回搜索集和结果

sql - 根据日期计算先前金额的余额?

c# - 使用野田时间获取给定偏移量(以分钟为单位)的时区列表

php - 搜索所有表

sql - 通用集合返回函数

python - 如何在 Pandas 中自定义解析日期

java - 服务器运行时 Hibernate 不创建表

python - 使用 Python 匹配一组值中的字典值

mysql - 没有事务的生活(MyISAM)