MySQL日期时间索引不起作用

表结构:

+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| id          | int(11)  | NO   | PRI | NULL    | auto_increment |
| total       | int(11)  | YES  |     | NULL    |                |
| thedatetime | datetime | YES  | MUL | NULL    |                |
+-------------+----------+------+-----+---------+----------------+

总行数: 137967

mysql> explain select * from out where thedatetime <= NOW();
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | out         | ALL  | thedatetime   | NULL | NULL    | NULL | 137967 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+

真正的查询是更多的表连接更长,问题是,我无法让表使用datetime索引。 如果我想在某个日期之前选择所有数据,这对我来说将会很难。 但是,我注意到如果我选择更小的数据子集,我可以让MySQL使用索引。

mysql> explain select * from out where thedatetime <= '2008-01-01';
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
| id | select_type | table       | type  | possible_keys | key         | key_len | ref  | rows  | Extra       |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
|  1 | SIMPLE      | out         | range | thedatetime   | thedatetime | 9       | NULL | 15826 | Using where |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+

mysql> select count(*) from out where thedatetime <= '2008-01-01';
+----------+
| count(*) |
+----------+
|    15990 |
+----------+

那么,我可以做些什么来确保MySQL将使用索引,无论我放置哪个日期?


一切都按预期运作。 :)

索引可以加快检索速度。 他们使用索引查找。

在你第一次查询索引时没有使用,因为你正在检索所有行,在这种情况下,使用索引较慢( lookup indexget rowlookup indexget row ... x行数较慢,然后get all rows = =表扫描)

在第二个查询中,您只检索部分数据,在这种情况下,表扫描速度要慢得多。

优化器的工作是使用RDBMS在索引中保留的统计信息来确定最佳计划。 在第一种情况下,索引被考虑,但规划师(正确)把它扔掉了。

编辑
您可能想要阅读这样的内容来获取有关mysql查询计划器的一些概念和关键字。


这里有两件事情 -

  • 指数没有足够的选择性 - 如果指数覆盖超过约。 30%的行,MySQL将决定全表扫描更有效率。 当你收缩指数时,

  • 联接中的每个表的一个索引

  • 真正的查询时间更长,更多的表连接,重点是......

    这一点完全是因为它加入了它可能不能使用该索引。 MySQL可以在连接中为每个表使用一个索引(除非它符合索引合并优化的条件)。 如果主键已用于联接,则不会使用datetime。 为了使用它,您需要按照正确的顺序在连接键+日期时间索引上创建多列索引。

    检查实际查询的EXPLAIN以查看MySQL用于连接的关键字。 修改该索引以包含thedatetime列,或者从两者中创建一个新的多列索引(具体取决于您使用连接键的用途)。

    链接地址: http://www.djcxy.com/p/4255.html

    上一篇: MySQL datetime index is not working

    下一篇: How do you set a default value for a MySQL Datetime column?