首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在MySql中的DATETIME字段的日期部分创建索引

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

Stack Overflow用户
提问于 2008-09-18 18:15:25
回答 11查看 69.9K关注 0票数 74

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

代码语言:javascript
复制
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条记录,语句

代码语言:javascript
复制
SELECT * FROM transactionlist where date(TranDateTime) = '2008-08-17' 

需要很长时间。

编辑:

看看这篇关于"Why MySQL’s DATETIME can and should be avoided“的博文。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2008-09-18 18:21:34

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

我会这样做:

代码语言:javascript
复制
SELECT * FROM transactionlist 
WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-17 23:59:59.999999';

这应该会给你在2008-08-17发生的所有事情。

票数 68
EN

Stack Overflow用户

发布于 2008-09-18 18:22:35

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

票数 16
EN

Stack Overflow用户

发布于 2017-06-14 23:13:59

另一个选项(relevant for version and above)是基于datetime列创建一个生成的/虚拟列,然后对其进行索引。

代码语言:javascript
复制
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;
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/95183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档