如果我在某个日期类型的表中有一个字段,并且我知道我将始终使用比较来搜索它between
,>
或者<
永远=
不可能有充分的理由不为其添加索引?
7 回答
不在要搜索的字段上添加索引的唯一原因是维护索引的成本超过了它的好处。
在以下情况下可能会发生这种情况:
DML
你的桌子上真的很难- 索引的存在使它慢得令人无法忍受,并且
DML
快速查询比快速查询更重要。
如果不是这种情况,那么只需创建索引。如果优化器认为不需要它,它就不会使用它。
还有更多不好的原因。
但是,如果索引是非聚集和非覆盖的,则搜索列上的索引可能还不够。像这样的查询通常是聚集索引的良好候选者,但是覆盖索引同样好。
这是一个很好的例子,说明为什么这既是艺术又是科学。一些考虑:
数据多久添加一次?如果读取/搜索远比添加/更改(某些表的全部目的是将数据转储到报告中),那么您想对索引发疯。ID 字段可能需要更多的聚集索引,但您可以拥有大量的多列索引(日期字段稍后出现,索引中较早列出的列可以很好地减少结果集),并且涵盖索引(所有返回的值都在索引中,所以它非常快,就像您从聚集索引开始搜索一样)。
如果表经常被编辑/添加,或者你的存储空间有限,因此不能有大量的索引,那么你必须更加小心你的索引。如果您的日期条件通常会提供广泛的数据,并且您不经常在其他字段上搜索,那么您可以为该日期字段提供一个聚集索引,但在您这样做之前请三思而后行。您在一个简单的自动编号字段上的聚集索引是所有索引的奖励。非覆盖索引使用聚集索引压缩到结果集的记录。除非您的大部分搜索都在该日期字段上,否则不要将聚集索引移动到日期字段。这是核选项。
如果你不能有很多覆盖的索引(表上的数据变化很大,空间有限,你的结果集很大而且变化很大),和/或你真的需要另一列的聚集索引,以及典型的日期条件提供了广泛的记录,你必须搜索很多,你有问题。如果您可以将数据转储到报表中,请执行此操作。如果你不能,那么你必须仔细平衡所有这些竞争因素。也许对于前 2-3 个搜索,您可以尽可能地减少结果集列,因为您可以配置覆盖的索引,而您让其余部分使用简单的非聚集索引
您可以看到为什么优秀的数据库人员应该得到高薪。我知道很多因素,但我羡慕人们能够快速正确地平衡所有这些事情,而无需进行大量分析。
如果您想每次都扫描整个表,请不要索引它。我希望数据库尝试进行范围扫描,所以我会添加 index,但我使用 SQL Server 并且在大多数情况下它将使用索引。然而不同的数据库很多不使用索引。
根据数据,我会走得更远,并建议如果您要进行BETWEEN
查询,它可能是一个聚集索引,以避免表扫描。
虽然索引有助于查询表,但它也会在一定程度上减慢插入、更新和删除的速度。如果表中的更改比查询多得多,则索引可能会损害整体性能。
如果表很小,它可能永远不会使用索引,因此添加它们可能只是浪费资源。
有一些数据类型(如 SQL Server 中的图像)和数据分布,其中索引不太可能使用或无法使用。例如,在 SQL Server 中,索引位字段是没有意义的,因为数据的可变性不足以让索引发挥作用。
如果您通常使用like 子句和通配符作为第一个字符进行查询,则不会使用索引,因此创建一个索引是另一种资源浪费。