目前,我正在设计一个包含数百万行的mysql表结构。我想搜索它的日期,时间,字段,按日期,年份等,但日期将由用户输入,所以它可能不是完整的日期一直。该字段已编入索引。在datetime字段上使用通配符是否足够快?就像这样
SELECT `id`, `moment`, `object_uid`, `content` FROM `events` WHERE moment like '2015%';它会使用索引吗?
有一个选项可以确定用户是否输入了年份或月份、年份等等,但是我更愿意让MySQL来完成这项工作。
发布于 2015-09-03 14:00:20
很难说您的查询是否会使用索引,因为这将基于MySQL的优化器根据您的数据分布和统计数据得出的最佳结果。
无论如何,最后的通配符是Sargable,所以至少通配符不是阻止您使用索引的因素。
另一方面,如果您只搜索年份,我的猜测是查询不会有足够的选择性来使用索引,年份和月份可能会这样做,但这很难判断。
请参阅我对这个问题的答复,以获得一个解释:为什么服务器查询计划在查询中不使用索引几乎与使用索引的查询相似?
这是Server的问题,但同样的原则也适用。
由于SQL server读取的是整个页面,而不是记录,所以您的查询(如统计信息所示)需要具有足够的选择性,以便使用索引,如果SQL server估计它将不得不读取每个页面,那么它将进行表扫描。
发布于 2015-09-04 06:16:32
您可以使用多种方法获取日期。
例如:
按年份分列:
选择
id、moment、object_uid、content从eventsWHERE (moment)=2015年;
按年份和月份分列:
选择
id、moment、object_uid、content,从events中选择年份(moment)=2015年和月份(moment)= 1;
按日期分列:
从
id,moment,object_uid,content中选择eventsmoment>= '2015-01-01‘
由DateTime:
选择
id,moment,object_uid,content从eventsWHEREmoment) >= '2015-01-01 00:00:00;
https://dba.stackexchange.com/questions/113093
复制相似问题