如何在MySql的DATETIME字段的日期部分创建索引

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

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用于保存交易发生的日期和时间

我的表有超过1,000,000条记录和声明

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

花费很长时间。

编辑:

看看这篇博客文章“为什么MySQL的DATETIME可以而且应该避免”


如果我没有记错,那将会运行整个表扫描,因为你正在通过函数传递列。 由于查询优化器无法真正了解函数的结果,因此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。


我的意思不是听起来很可爱,但一个简单的方法是添加一个只包含日期部分和索引的新列。


您不能仅在日期部分创建索引。 你有什么理由吗?

即使您只能在日期部分创建索引,优化程序仍可能不会将其用于上述查询。

我想你会发现

SELECT * FROM transactionlist WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-18'

高效,做你想做的。

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

上一篇: How does one create an index on the date part of DATETIME field in MySql

下一篇: MySQL datetime index is not working