如何在MySQL中的datetime字段的日期部分创建索引?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (240)

如何在日期时间字段的日期部分创建索引?

mysql> SHOW COLUMNS FROM transactionlist;
+-------------------+------------------+------+-----+---------+----------------+
| Field             | Type             | Null | Key | Default | Extra          |
+-------------------+------------------+------+-----+---------+----------------+
| TransactionNumber | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| WagerId           | int(11)          | YES  | MUL | 0       |                |
| TranNum           | int(11)          | YES  | MUL | 0       |                |
| TranDateTime      | datetime         | NO   |     | NULL    |                |
| Amount            | double           | YES  |     | 0       |                |
| Action            | smallint(6)      | YES  |     | 0       |                |
| Uid               | int(11)          | YES  |     | 1       |                |
| AuthId            | int(11)          | YES  |     | 1       |                |
+-------------------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

TranDateTime用于保存事务发生时的日期和时间。

我的表中有超过100万条记录和语句

SELECT * FROM transactionlist where date(TranDateTime) = '2008-08-17' 

需要很长时间。

提问于
用户回答回答于

如果我没记错的话,这将运行整个表扫描,因为要通过一个函数传递列。MySQL将顺从地为每一列运行函数,绕过索引,因为查询优化器不能真正知道函数的结果。

我要做的是:

SELECT * FROM transactionlist 
WHERE TranDateTime BETWEEN '2008-08-17 00:00:00' AND '2008-08-18 23:59:59';

这应该会给你所有发生在2008-08-17,以及所有发生在2008年-08-18上午00:00:00的事情。如果这是个问题,你可以把第二个学期改为‘2008-08-17 23:59:59’,只需得到2008-08-17。

用户回答回答于

添加一个新列,其中只包含日期部分和索引。

扫码关注云+社区