作为“ 什么是索引,以及如何使用它们来优化数据库中的查询? ” 的后续尝试,在尝试了解索引的地方,哪些列是良好的索引候选者?专门针对MS SQL数据库?
经过一番谷歌搜索后,我读到的所有内容都表明,通常增加且唯一的列构成了很好的索引(例如MySQL的auto_increment之类的东西),我理解这一点,但是我使用的是MS SQL,并且我将GUID用于主键,所以看起来索引不会使GUID列受益...
作为“ 什么是索引,以及如何使用它们来优化数据库中的查询? ” 的后续尝试,在尝试了解索引的地方,哪些列是良好的索引候选者?专门针对MS SQL数据库?
经过一番谷歌搜索后,我读到的所有内容都表明,通常增加且唯一的列构成了很好的索引(例如MySQL的auto_increment之类的东西),我理解这一点,但是我使用的是MS SQL,并且我将GUID用于主键,所以看起来索引不会使GUID列受益...
Answers:
索引在查询优化和快速从表中搜索结果中可以发挥重要作用。因此,选择要索引的列是最重要的步骤。我们可以考虑在两个主要位置建立索引:WHERE子句中引用的列和JOIN子句中使用的列。简而言之,应该对这些列进行索引,以便您根据这些列搜索特定记录。假设我们有一个名为Buyers的表,其中SELECT查询使用如下索引:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
由于在“选择”部分中引用了“ buyer_id”,因此MySQL不会使用它来限制所选行。因此,没有必要对其进行索引。下面是另一个示例,与上面的示例几乎没有什么不同:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
根据上面的查询first_name,last_name列可以索引,因为它们位于WHERE子句中。另外,可以考虑将国家表中的另一个字段country_id用作索引,因为它位于JOIN子句中。因此可以在WHERE子句或JOIN子句中的每个字段上考虑索引。
下面的列表还提供了一些技巧,打算在表中创建索引时应始终牢记:
更新(2015年2月23日):
任何索引(好/坏)都会增加插入和更新时间。
根据您的索引(索引数和类型),搜索结果。如果您的搜索时间由于索引而增加,那么索引不好。
在任何书籍中,“索引页面”都可能具有章节开始页面,主题页面编号开始,子主题页面开始。索引页面中的一些说明会有所帮助,但更详细的索引可能会使您感到困惑或恐惧。索引也有内存。
索引选择应该是明智的。请记住,并非所有列都需要索引。
WHERE
,JOINS
或者HAVING
?
WHERE
子句中我正在检查一个字段的值,其中该字段的列只能采用两个值,那么我应该索引该二进制列?这似乎是错误的。
有些人在这里回答了类似的问题:您如何知道什么是好的索引?
基本上,这实际上取决于您将如何查询数据。您需要一个索引,以快速识别与查询相关的数据集的一小部分。如果您从不按日期戳查询,则即使它是唯一的,也不需要索引。如果您要做的只是获取在特定日期范围内发生的事件,那么您肯定想要一个。在大多数情况下,关于性别的指数是没有意义的-但是,如果您要做的只是获得有关所有男性的统计数据,以及分别获得有关所有女性的统计数据,那么可能值得您花些时间来创建一个。弄清楚您的查询模式是什么,访问哪个参数可以最大程度地缩小搜索空间,这就是您的最佳索引。
还要考虑一下您创建的索引的种类-B树对大多数事情都适用,并且允许范围查询,但是哈希索引可以使您直截了当地(但不允许范围)。其他类型的索引具有其他优点和缺点。
祝好运!
一般而言(我不使用mssql,因此无法具体注释),主键可以作为良好的索引。它们是唯一的,并且必须指定一个值。(此外,主键会建立良好的索引,因此通常它们会自动创建一个索引。)
索引实际上是已排序以允许二进制搜索(比线性搜索快得多)的列的副本。数据库系统可能会使用各种技巧来进一步加快搜索速度,尤其是当数据比简单数字复杂时。
我的建议是最初不要使用任何索引并配置您的查询。如果经常执行特定查询(例如,按姓氏搜索人),请尝试再次在相关属性和配置文件上创建索引。如果查询的速度明显提高,而插入和更新的速度降低得可以忽略不计,则保留索引。
(很抱歉,如果我要重复您在其他问题中提到的内容,我以前没有碰到过。)
GUID列不是索引的最佳选择。索引最适合具有可赋予某些有意义顺序(即排序(整数,日期等))的数据类型的列。
列中的数据是否通常会增加并不重要。如果在列上创建索引,则索引将创建它自己的数据结构,该数据结构将简单地引用表中的实际项目,而无需考虑存储顺序(非聚集索引)。然后,例如可以对索引数据结构执行二进制搜索以提供快速检索。
也可以创建一个“聚簇索引”,以物理方式对数据进行重新排序。但是,每个表只能有其中之一,而您可以有多个非聚集索引。