首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql日期时间字段部分匹配

问Mysql日期时间字段部分匹配
EN

Database Administration用户
提问于 2015-09-03 13:35:34
回答 2查看 2.5K关注 0票数 0

目前,我正在设计一个包含数百万行的mysql表结构。我想搜索它的日期,时间,字段,按日期,年份等,但日期将由用户输入,所以它可能不是完整的日期一直。该字段已编入索引。在datetime字段上使用通配符是否足够快?就像这样

代码语言:javascript
复制
SELECT `id`, `moment`, `object_uid`, `content` FROM `events` WHERE moment like '2015%';

它会使用索引吗?

有一个选项可以确定用户是否输入了年份或月份、年份等等,但是我更愿意让MySQL来完成这项工作。

SQLfiddle

EN

回答 2

Database Administration用户

回答已采纳

发布于 2015-09-03 14:00:20

很难说您的查询是否会使用索引,因为这将基于MySQL的优化器根据您的数据分布和统计数据得出的最佳结果。

无论如何,最后的通配符是Sargable,所以至少通配符不是阻止您使用索引的因素。

例如,请参阅布伦特·奥扎尔或罗布·法利发布的这篇文章

另一方面,如果您只搜索年份,我的猜测是查询不会有足够的选择性来使用索引,年份和月份可能会这样做,但这很难判断。

请参阅我对这个问题的答复,以获得一个解释:为什么服务器查询计划在查询中不使用索引几乎与使用索引的查询相似?

这是Server的问题,但同样的原则也适用。

由于SQL server读取的是整个页面,而不是记录,所以您的查询(如统计信息所示)需要具有足够的选择性,以便使用索引,如果SQL server估计它将不得不读取每个页面,那么它将进行表扫描。

票数 0
EN

Database Administration用户

发布于 2015-09-04 06:16:32

您可以使用多种方法获取日期。

例如:

按年份分列:

选择id、moment、object_uid、content从events WHERE (moment)=2015年;

按年份和月份分列:

选择id、moment、object_uid、content,从events中选择年份(moment)=2015年和月份(moment)= 1;

按日期分列:

从id,moment,object_uid,content中选择events moment >= '2015-01-01‘

由DateTime:

选择id,moment,object_uid,content从events WHERE moment) >= '2015-01-01 00:00:00;

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/113093

复制
相关文章

相似问题

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