数据库索引:好事,坏事还是浪费时间?

smi*_*man 13 sql database-design cross-platform

这里通常建议添加索引作为性能问题的补救措施.

(我说的只是阅读和查询,我们都知道索引会使写入速度变慢).

多年来,我在DB2和MSSQL上多次尝试过这种补救措施,结果总是令人失望.

我的发现是,无论一个指数如何变得更好,"它显得更好",结果表明查询优化器更加智能,而我精心选择的索引几乎总是让事情变得更糟.

我应该指出,我的经历主要涉及小桌子(<100'000行).

任何人都可以提供一些关于索引选择的实用指南吗?

正确的答案是建议列表如下:

  • 从不/始终索引小于/大于NNNN记录的表
  • 从不/始终考虑多字段键上的索引
  • 从不/始终使用聚簇索引
  • 永远/永远不会在单个表上使用多于​​NNN索引
  • 从来没有/总是添加一个索引[某些神奇的条件,我很想知道]

理想情况下,答案将给出一些有益的例子.

Ken*_*eng 18

指数有点像化学疗法......太多了它会杀死你......太少而且你死了......做错了,你就死了.你必须知道它有多少,多少次,以及什么样的方式让它不会杀了你.

您的硬件,平台,环境,负载都发挥作用.所以回答你的问题..

是的,可能有时候.

  • 喜欢化疗比喻(对不起,查理维拉纽瓦),但你应该补充一点"无论发生什么,你都会感到非常恶心". (8认同)
  • +1确实,可爱的比喻,可能比我们大多数人想要的更接近现实 (3认同)

HLG*_*GEM 12

根据经验,主键和外键需要编制索引.通常只通过定义主键来索引主键,但FK不在每个数据库中(它们肯定不在SQL Server中,我不能真正代表其他dbs).您将在连接中使用这些,因此定义这些通常对性能至关重要.

现在,如果你经常在where子句中使用字段,他们可以从索引中受益,并提供以下几点:

  • 首先,该字段必须具有一系列值.位字段或只有2或3个值的字段几乎不会使用索引.

  • 其次,你写的查询必须是sargable.那就是它们必须设计为使用索引.我怀疑如果你从来没有从索引的可能候选者那里获得性能改进,那么你可能会有一些不可思议的查询.例如,将"WHERE Name like'%Smith'"作为where子句.在不知道第一个字符的情况下,优化器无法使用索引.

小表很少从索引中获益.如果优化器可以将整个内容保存在内存中,那么这样做通常会更快.如果您使用的是数百万条记录表,您会发现索引至关重要.

索引可能非常复杂,如果您对该主题感兴趣,我建议您获得一本关于性能调优特定数据库的好书,并深入了解它们.


Gil*_*anc 5

从未使用的索引是浪费磁盘空间,以及添加插入/更新/删除时间.最好先定义聚类索引,然后在发现自己编写WHERE子句时定义其他索引.

我看到的一个常见索引错误是人们想知道为什么当索引被定义为时,col2(或col3)上的select会花费这么长时间col1 ASC, col2 ASC, col3 ASC.如果有多列索引,则WHERE子句必须使用索引中的第一列,或索引中的第一列和第二列,依此类推.

如果需要通过col2访问数据,则需要一个定义为的附加索引col2 ASC.

对于小域表,执行表扫描有时比使用索引从表中读取行更快.这取决于数据库计算机的速度和网络的速度.