我想做的是索引一个人的名字和他们的出生日期。
表格是这样布置的:
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/