sqlserver 日期字段 索引问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 日期字段 索引问题相关的知识,希望对你有一定的参考价值。
日期 单号 类型 借方 贷方
2013-1-1 0001 A 1 0
2013-1-1 0001 A 58 0
2013-2-2 0002 A 56 0
2013-2-2 0003 A 15 0
2013-2-2 0004 A 53 0
上百万数据,日期列作为条件查询 怎样添加索引
我还要按照年度给表和索引分区的 索引分区怎么写
参考技术B 如果你要把全部列输出的话,就给日期字段添加索引就行了在mysql中索引日期时间字段是个好主意吗?
【中文标题】在mysql中索引日期时间字段是个好主意吗?【英文标题】:Is it a good idea to index datetime field in mysql? 【发布时间】:2013-03-03 17:51:21 【问题描述】:我正在设计一个大型数据库。在我的应用程序中,我将有很多行,例如我目前有一个包含 400 万条记录的表。我的大多数查询都使用 datetime 子句来选择数据。在mysql数据库中索引日期时间字段是个好主意吗?
Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days
我正在努力让我的数据库保持良好的运行状态并让查询顺利运行
另外,你觉得我应该有什么想法来创建一个高效的数据库?
【问题讨论】:
field 20
是什么?
【参考方案1】:
MySQL 出于多种原因建议使用索引,包括消除条件之间的行:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
如果您要在查询中频繁使用它,这会使您的日期时间列成为索引的绝佳候选者。如果您的唯一条件是 BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY)
并且条件中没有其他索引,则 MySQL 将不得不对每个查询进行 全表扫描。我不确定在 30 天内生成了多少行,但只要它小于总行数的 1/3 左右,在列上使用索引会更有效。
您关于创建高效数据库的问题非常广泛。我会说只是确保它被规范化并且所有适当的列都被索引(即在连接和 where 子句中使用的列)。
【讨论】:
感谢您的解释。这真的很有帮助。我相信我会有更多的过滤器。我只是想确保索引日期时间字段是一个好主意,因为我们可能有重复的日期时间。但你的回答解释了它:) 谢谢 +1 表示“用于连接和 where 子句的那些”。索引策略的一个很好的经验法则。很明显,现在我想到了,但以前没有想到过 但是如果查询日期为范围的数据,比如数据范围从“2017-01-01 11:20”到“2018-01-03 12:12” ",即使我索引了date time
列,它也不会使SELECT
查询更快......当我使用equal
操作时,索引会使查询速度更快.. 对吗?
如果使用 DAY(datetime) 或 HOUR(datetime) 等时间函数查询 datetime 字段怎么样。在这种情况下,索引会帮助还是阻碍?
嗨@Explosion Pills,如果我只需要根据年份和月份查询表,如果我创建一个只有年份和月份的新列然后索引它,我会获得更好的性能,而不是直接创建日期时间列的索引?比如我创建一列,其值为 201801。【参考方案2】:
Here 作者进行的测试表明整数 unix 时间戳优于 DateTime。注意,他使用的是 MySql。但是我觉得无论您使用什么数据库引擎,比较整数都比比较日期略快,因此 int 索引优于 DateTime 索引。取 T1 - 比较 2 个日期的时间,T2 - 比较 2 个整数的时间。搜索索引字段大约需要 O(log(rows)) 时间,因为索引基于一些平衡树 - 对于不同的数据库引擎可能会有所不同,但无论如何 Log(rows) 是常见的估计。 (如果您不使用位掩码或基于 r-tree 的索引)。所以区别是 (T2-T1)*Log(rows) - 如果您经常执行查询,可能会起作用。
【讨论】:
谢谢。我正在考虑将其作为一种选择,但不知道如何处理它。我相信你是绝对正确的整数总是更快。 更好?我怀疑 unix 时间戳更适合 all 情况。是的,存储一个整数通常比存储一个字符串要快,但是所有的DateTime functions MySQL 暴露了什么呢?自己实现它们会对性能或功能产生负面影响。 我使用一个遗留 Web 应用程序,开发人员坚持对数据库中的所有内容使用 unix 时间戳。因此,多年来使用日期绝对是一场噩梦,我花了很多时间尽可能地将所有内容迁移到日期时间或时间戳 SQL 字段。我确信在某些情况下 unix 时间戳很有用,但通常我认为你最好避免使用它们。 是的,MySQL 使用 5 字节表示(分隔年、月等)存储日期,这有点奇怪。以上是关于sqlserver 日期字段 索引问题的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:日期时间、ASC 或 DESC 上的聚集索引
sqlserver group by 非聚集多字段组合索引性能慢的问题