哪些列通常可以构成良好的索引?

时间:2020-03-06 14:28:38  来源:igfitidea点击:

作为"什么是索引,以及如何使用它们来优化数据库中的查询?"的后续内容。我在哪里尝试了解索引,哪些列是好的索引候选者?专门针对MS SQL数据库?

经过一番谷歌搜索后,我读到的所有内容都表明,通常增加且唯一的列构成了很好的索引(例如MySQL的auto_increment之类的东西),我理解这一点,但是我使用的是MS SQL,并且我将GUID用于主键,所以看起来该索引不会使GUID列受益...

解决方案

一般而言(我不使用mssql,因此无法具体注释),主键可以作为良好的索引。它们是唯一的,并且必须指定一个值。 (此外,主键会建立良好的索引,因此通常它们会自动创建一个索引。)

索引实际上是已排序以允许二进制搜索(比线性搜索快得多)的列的副本。数据库系统可能会使用各种技巧来进一步加快搜索速度,尤其是当数据比简单数字复杂时。

我的建议是最初不要使用任何索引并配置查询。如果经常执行特定查询(例如,按姓氏搜索人),请尝试再次在相关属性和配置文件上创建索引。如果查询的速度明显提高,而插入和更新的速度降低得可以忽略不计,则保留索引。

(很抱歉,如果我要重复我们在其他问题中提到的内容,我以前没有碰到过。)

GUID列不是索引的最佳选择。索引最适合具有可赋予某些有意义顺序(即排序(整数,日期等))的数据类型的列。

列中的数据通常是否增加并不重要。如果在列上创建索引,则索引将创建它自己的数据结构,该数据结构将简单地引用表中的实际项目,而无需考虑存储顺序(非聚集索引)。然后,例如可以对索引数据结构执行二进制搜索以提供快速检索。

也可以创建一个"聚簇索引",以物理方式对数据进行重新排序。但是,每个表只能有其中一个,而我们可以有多个非聚集索引。

如果使用的是GUID,它甚至应该更快。
假设我们有记录

  • 100
  • 200
  • 3000
  • ....

如果我们有一个索引(二进制搜索),则可以在O(lg n)的时间内找到要查找的记录的物理位置,而不是顺序搜索O(n)的时间。这是因为我们不知道自己拥有的记录是什么在你的桌子上。

这确实取决于查询。例如,如果我们几乎只写一个表,那么最好不要有任何索引,它们只会减慢写操作的速度,并且永远不会被使用。我们用来与另一个表联接的任何列都是索引的理想选择。

另外,请阅读有关缺少索引功能的信息。它监视对数据库使用的实际查询,并可以告诉我们哪些索引可以提高性能。

有些人在这里回答了类似的问题:我们如何知道什么是好的索引?

基本上,这实际上取决于我们将如何查询数据。我们需要一个索引,以快速识别与查询相关的数据集的一小部分。如果我们从不按日期戳查询,则即使它是唯一的,也不需要索引。如果我们要做的只是获取在特定日期范围内发生的事件,那么我们肯定想要一个。在大多数情况下,关于性别的指数是没有意义的-但是,如果我们要做的只是获得有关所有男性的统计数据,以及分别获得有关所有女性的统计数据,那么可能值得我们花些时间来创建一个。弄清楚查询模式是什么,访问哪个参数可以最大程度地缩小搜索空间,这就是最佳索引。

还要考虑一下我们创建的索引的种类-B树适合大多数情况,并且允许范围查询,但是哈希索引可以使我们直接理解问题(但不允许范围)。其他类型的索引也有其他优点和缺点。

祝你好运!

经验法则是在WHERE,ORDER BY和GROUP BY子句中经常使用的列,或者似乎经常在联接中使用的列。请记住,我指的是索引,不是主键

不要给出"香草般的"答案,但这实际上取决于我们访问数据的方式

最佳索引取决于表的内容以及我们要完成的工作。

以一个具有成员社会保险号的主键的成员数据库为例。我们选择S.S.是因为应用程序优先权是通过这种方式引用个人的,但是我们还想创建一个搜索功能,该功能将利用成员的名字和姓氏。然后,我建议在这两个字段上创建一个索引。

我们应该首先找出要查询的数据,然后确定需要为哪些数据建立索引。

主键应始终是索引。 (实际上,如果它没有被MS SQL自动索引,我会感到惊讶。)我们还应该经常索引SELECT或者ORDER列;它们的目的是快速查找单个值和更快地排序。

索引过多列的唯一真正危险是减慢大型表中对行的更改,因为索引也都需要更新。如果我们真的不确定要索引的内容,只需对最慢的查询进行计时,查看最常使用的列,然后对其进行索引。然后看看它们有多快。

这完全取决于我们希望对表进行哪些查询。如果我们要求X列的所有行都具有特定值,那么如果无法使用索引,则必须进行全表扫描。

在以下情况下,索引将很有用:

  • 一列或者多列具有高度的唯一性
  • 我们经常需要为该列寻找某个值或者值的范围。

在以下情况下它们将无用:

  • 我们正在表中选择很大的%(> 10-20%)行
  • 额外的空间使用是一个问题
  • 我们想要最大化插入性能。表上的每个索引都会降低插入和更新性能,因为每次数据更改时都必须更新它们。

主键列通常非常适合索引,因为它们是唯一的并且通常用于查找行。

应该定期用于从表中提取数据的任何列都应建立索引。

这包括:
外键-

select * from tblOrder where status_id=:v_outstanding

描述性字段-

select * from tblCust where Surname like "O'Brian%"

列不必是唯一的。实际上,当搜索异常时,我们可以从二进制索引中获得非常好的性能。

select * from tblOrder where paidYN='N'

由于多种原因,按升序或者降序排列的数字数据类型是好的索引。首先,与字符串(varchar,char,nvarchar等)相比,数字的求值速度通常更快。其次,如果未对值进行排序,则可能需要重新排列行和/或者页面以更新索引。那是额外的开销。

如果我们使用的是SQL Server 2005,并且开始使用uniqueidentifiers(引导),并且不需要它们具有随机性,请检查顺序的uniqueidentifier类型。

最后,如果我们在谈论聚簇索引,则是在谈论物理数据的种类。如果我们有一个字符串作为聚簇索引,那可能会很难看。