在哪里可以找到有关索引策略的指导?


22

我们大多数人可能会同意使用数据库索引是好的。太多的索引和性能实际上可能会降低。

通常,应该为哪些字段建立索引?
哪些字段不应该建立索引?
在实现过多索引与不足索引以达到性能提升而不是降级之间的平衡时,使用索引的规则是什么?


7
有关索引的指导,请使用index-luke.com
Mike Sherrill'Cat Recall'

Answers:


24

我认为“索引过多”规则有点误导。

鉴于平均数据库约为98%的读取(或更高),因此需要优化读取。例如,如果存在唯一索引,则INSERT为读取。或在哪里更新。我曾经读过,即使一个写密集型数据库也仍然是85%的读取。

您所要做的就是索引质量差。例子:

  • 广泛的聚集索引(尤其是SQL Server)
  • 非单调聚类索引
  • 重叠索引(例如cold, colecold, cole, colf)
  • 许多单列索引(也与更多有用的索引重叠)对查询无用
  • 没有包含,没有覆盖(例如,所有单列索引)
  • ...

请注意,即使在OLTP系统中,索引也比实际数据大几倍是非常典型的。

通常,我将从

  • 聚集索引(通常为PK)
  • 唯一索引(不是约束,不能覆盖)
  • 外键列

然后我看一下:

  • 常见查询,看看我需要什么。每秒钟运行一次的查询需要调整。报告在周日凌晨4点可以等待。
  • 与SQL Server,加权丢失的索引DMV

话虽如此,但我看到了如何解决问题(后来又有100亿行)来调整系统后,才打破了某些系统的这些规则。但是我永远不会考虑编制索引,除非我能证明为什么这样做。


2
你从哪里得到这些数字的?98%的用户似乎过高,尤其是在“大数据”时代(又存储了一切,希望有一天
RM

7

您应该分析数据库的使用情况和负载,并确定由于缺少索引或由于索引过多而导致的瓶颈。然后,您必须选择适当的索引-这需要对特定的数据库索引技术有充分的了解。


7

盖尔·肖(Gail Shaw)简直是最好的系列文章之一,该系列文章中就选择了哪些索引以及为什么选择索引。您可以通过单击此处找到文章

您可以用50种不同的方式回答您提出的问题。实际上,所有这些都归结为您拥有的数据以及如何查询它们。一般规则是,在每个表上都应始终具有聚集索引,以避免堆。聚集索引通常应尽可能小。如果表具有聚簇索引,则非聚簇索引的叶子页上的所有索引记录都将存储各自的聚簇索引的记录值以进行书签查找。如果表是堆,则SQL将为书签查找创建唯一的标识符。我不记得它的大小是8个字节还是16个字节。然后可能会是一个更大的数据类型,然后再说一个INT。想象一下,堆表上有8个非聚集索引。


读者请注意:MS SQL“书签查找”等效于Oracle的“ ACCESS BY ROWID”。见 stackoverflow.com/a/820731/122727
kubanczyk

5

我想在这里补充一点,不同的数据库需要不同的策略。例如,让我们比较带有InnoDB和PostgreSQL的MySQL。

创新数据库

InnoDB表基本上是主键的b树索引,该索引被扩展为在索引条目中包括行信息。不支持物理顺序扫描,所有扫描均以逻辑顺序进行。这意味着两件事:

  1. Innodb中的顺序扫描会生成大量随机磁盘I / O,并且

  2. 无论是否正在使用辅助索引,都必须遍历主键索引。

  3. 在此模型中,主键查找比任何其他方法都快。

在这种情况下,索引多页表中的足够字段非常重要。典型的规则是为要过滤的所有内容编制索引。

PostgreSQL的

PostgreSQL使用堆文件,每个文件一个表(某些表可能是多个文件),其中从该堆的可用空间分配元组。支持实物订单扫描。为了使逻辑顺序扫描正常工作,必须添加索引。

PostgreSQL中的主键基本上是唯一索引的子集,其中任何值都不能为NULL。UNIQUE约束是使用隐式索引完成的,并且通过索引中可能的不同操作来支持其他几种索引类型。

这意味着:

  1. 假设表相当大,则主键查找需要命中索引文件表文件。这比MySQL的方法要慢得多,在MySQL的方法中,仅必须遍历索引,并且行包含在索引中。

  2. 物理顺序扫描的性能要好得多,从而减少了要处理大量行的随机磁盘I / O。

  3. 二级索引扫描的性能优于MySQL,因为仅遍历一个索引即可到达表的物理部分。

在此模型中,索引通常是必需的,但是计划者在使用索引时拥有更大的自由度,而不使用索引的含义通常不那么严重。这些表通常进行了优化(而不是专门研究pkey查找),因此需要的索引更少。

TL; DR

了解您的RDBMS。



2

即使具有上述所有链接,您也需要查看Kimberly Tripp关于索引的维护,喂养和使用所写的内容。

对于初学者,请单击此链接链接到金伯利的与索引相关的博客文章集。您可以使用浏览器窗口左侧的“在此页面上”和“类别”窗口小部件来浏览特定主题。

这里有很多信息,但是请不要被它吓到。

金伯利的“关于”页面在这里


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.