如何在日期时间字段的日期部分创建索引?
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'
需要很长时间。
编辑:
看看这篇关于"Why MySQL’s DATETIME can and should be avoided“的博文。
发布于 2008-09-18 18:21:34
如果我没记错的话,这将运行整个表扫描,因为您正在通过一个函数传递列。MySQL将顺从地为每一列运行函数,绕过索引,因为查询优化器不能真正知道函数的结果。
我会这样做:
SELECT * FROM transactionlist
WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-17 23:59:59.999999';
这应该会给你在2008-08-17发生的所有事情。
发布于 2008-09-18 18:22:35
我不想听起来很可爱,但一种简单的方法是添加一个仅包含日期部分和索引的新列。
发布于 2017-06-14 23:13:59
另一个选项(relevant for version and above)是基于datetime列创建一个生成的/虚拟列,然后对其进行索引。
CREATE TABLE `table` (
`my_datetime` datetime NOT NULL,
`my_date` varchar(12) GENERATED ALWAYS AS (DATE(`my_datetime`)) STORED,
KEY `my_idx` (`my_date`)
) ENGINE=InnoDB;
https://stackoverflow.com/questions/95183
复制相似问题