什么是索引以及如何使用它们来优化数据库中的查询?

时间:2008-09-19 20:37:12

标签: sql sql-server database-design

我正在维护一个相当大的应用程序和数据库,并注意到我们的一些存储过程中的数据库性能不佳。

我总是听说“添加索引”可以帮助提高性能。我当然不是DBA,我不明白索引是什么,为什么它们有帮助,以及如何创建它们。

我基本上需要索引101.

任何人都可以给我资源以便我可以学习吗?

9 个答案:

答案 0 :(得分:31)

根据经验,索引应该在您在连接或where子句中使用的任何字段上(如果它们具有足够的不同值以使用有价值的索引,则仅具有几个可能值的字段不会受益于索引这就是为什么尝试索引一个字段是没有意义的)。

如果你的结构已经正式创建了主键(我应该创建一个没有主键的表),那么根据定义索引是因为主键需要有一个唯一的索引。人们经常忘记他们必须索引外键,因为在设置外键关系时不会自动创建索引。由于外键的目的是为您提供一个连接字段,因此大多数外键应该被编入索引。

需要维护一旦创建的索引。如果您有大量的数据更改活动,它们可能会碎片化,性能降低,需要刷新。在线阅读有关索引的书籍。您还可以在那里找到create index语句的语法。

索引是一种平衡行为,您添加的每个索引通常都会为数据插入,更新和删除添加时间,但可以加速复杂插入,更新和删除中的选择和连接。尽管上面的经验法则是一个很好的起点,但没有一个公式可以确定最佳指数。

答案 1 :(得分:24)

考虑类似于库中卡片目录的索引。索引使您无需搜索书籍的每个岛屿或书架。相反,您可能能够从常用字段中找到所需的项目,例如ID和名称等。构建索引时,数据库基本上会创建一个与查询可能匹配的内容,而不是扫描整个表。您可以通过允许搜索较小的数据子集或优化的数据集来加速查询。

答案 2 :(得分:6)

索引是数据库系统用于快速查找数据的方法。现实世界的比喻是书中的索引。如果作者/出版商在索引他们的书方面做得很好,那么读者很容易通过查看索引直接转到他们想要阅读的页面。数据库也是如此。如果在字段上创建索引,则数据库会对数据进行预排序。当对数据发出请求时,数据库使用索引来识别数据存储在硬盘上的位置,并直接进入那里。如果没有索引,数据库需要查看每条记录,以确定它是否符合查询的条件。

查看索引的一种简单方法是考虑一副牌。未编入索引的数据库就像是已经洗牌的卡片。如果你想找到黑桃王,你需要逐一查看每张卡片才能找到它。你可能很幸运,它可能是第一个,或者你可能是不幸的,它可能是最后一个。

一个被编入索引的数据库,牌组中的所有牌都是从王牌到王牌,每个套牌都放在自己的堆里。寻找黑桃王现在要简单得多,因为你只需要查看包含黑桃的一堆牌的底部。

我希望这会有所帮助。但要注意的是,虽然索引在关系数据库系统中是必需的,但如果编写太多索引,它们可能会产生效果。网上有很多很棒的文章,你可以阅读索引。我建议你在深入了解之前做一些阅读。

答案 3 :(得分:5)

索引基本上对给定列上的数据进行排序,然后存储该顺序,因此当您想要查找项目时,数据库可以通过使用二进制搜索(或其他一些优化的搜索方式)进行优化,而不是查看每一行。

因此,如果您搜索的数据量很大,您绝对想要添加一些索引。

大多数数据库都有一个工具来解释你的查询将如何工作(对于db2,它的db2expln,类似于sqlserver的类似),以及一个建议索引和其他优化的工具(db2的db2advis,同样可能类似于sqlserver)

答案 4 :(得分:3)

如前所述,您可以拥有聚簇索引和多个非聚簇索引。在SQL 2005中,您还可以向非聚集索引添加其他列,这可以提高性能,其中一些通常检索的列包含在索引中但不包含在键的一部分中,从而完全消除了对表的访问。

用于确定SQL Server数据库正在执行的操作的第一个工具是分析器。您可以分析整个工作负载,然后查看它建议的索引。您还可以查看执行计划以查看索引的影响。

过多的索引问题是由于写入数据库,并且必须更新将具有该行记录的所有索引。如果你有阅读表现,可能不是因为索引太多,而是太少或太不适合。

答案 5 :(得分:1)

索引可以解释为寄存器中项目的排序列表。通过在索引中查找它的键,可以非常快速地在寄存器中查找项目的位置。接下来,索引中的键是指向寄存器中可以找到其余记录的位置的指针。

你可以在寄存器上有很多索引,但是你拥有的索引越多,插入新记录的速度就越慢(因为每个索引也需要一个新记录 - 按排序顺序,这也增加了时间)。

答案 6 :(得分:1)

在现有表中创建索引,以更快速有效地定位行。可以在表的一列或多列上创建索引,并为每个索引指定名称。用户无法看到索引,它们只是用于加速查询。

基本上,您的DBMS将创建某种树结构,该结构以排序的方式指向数据(来自一列)。通过这种方式,可以更轻松地搜索该列上的数据。

http://en.wikipedia.org/wiki/Index_(database)

答案 7 :(得分:1)

更多索引信息!

聚簇索引是表中记录的实际物理布局。因此,每张桌子只能有一张。

非聚集索引是上述卡片目录。当然,书籍按特定顺序排列,但您可以按照书本大小,或者按页数或字母顺序排列目录中的卡片。

要考虑的事情 - 创建太多索引是一个常见的陷阱。每次数据更新时,您的数据库都必须通过该索引进行搜索并更新它,将记录插入该表的每个索引中以获取该新行。在交易系统中(想想:纽约证券交易所的股票交易!)可能是一个应用杀手。

答案 8 :(得分:0)

对于mssql(以及其他人),语法如下:

create index <indexname> on <tablename>(<column1>[,<column2>...])