什么是索引,如何使用它们来优化数据库中的查询?
我正在维护一个相当大的应用程序和数据库,并注意到我们的一些存储过程中数据库性能很差。
我总是听到可以通过添加索引来提高性能。我当然不是DBA,而且我也不了解什么是索引,它们为什么有帮助以及如何创建它们。
我基本上需要一个索引101.
谁能给我资源以便我学习?
解决方案
索引基本上是对给定列上的数据进行排序,然后存储该顺序,因此当我们要查找项目时,数据库可以通过使用二进制搜索(或者某种其他优化的搜索方式)进行优化,而不用查看每一行。
因此,如果要搜索的数据量很大,则绝对要添加一些索引。
大多数数据库都有一个工具来解释查询的工作方式(对于db2,它是db2expln,对于sqlserver来说可能类似),以及一个建议索引和其他优化的工具(对于db2来说,db2advis,对于sqlserver也可能类似)。
索引可以解释为寄存器中项目的排序列表。通过在索引中查找项目的键,可以非常快速地查找项目在寄存器中的位置。接下来,索引中的键是指向寄存器中可以找到其余记录的位置的指针。
我们可以在寄存器上拥有许多索引,但是拥有的索引越多,插入新记录的速度就越慢(因为每个索引也需要按排序顺序存储一条新记录,这也会增加时间)。
考虑一个类似于库中卡目录的索引。索引使我们不必在每个小岛或者书架中搜索一本书。取而代之的是,我们可以从一个常用字段中找到所需的项,例如和ID,名称等。建立索引时,数据库基本上会创建一些单独的东西,查询可以击中这些东西,而不是扫描整个表。通过允许查询较小的数据子集或者优化的数据集,可以加快查询速度。
在现有表中创建索引以更快,更有效地定位行。可以在表的一个或者多个列上创建索引,并且为每个索引指定一个名称。用户看不到索引,它们只是用来加速查询。
基本上,DBMS将创建某种树形结构,该树形结构以一种排序的方式指向数据(从一列中)。这样,可以更轻松地搜索该列上的数据。
http://zh.wikipedia.org/wiki/索引_(数据库)
索引是数据库系统用来快速查找数据的一种方法。现实世界中的类比是书籍中的索引。如果作者/出版商在为他们的书编索引方面做得很好,那么读者只需看一下索引就可以直接直接转到他们想要阅读的页面。数据库也是如此。如果在字段上创建了索引,则数据库将对数据进行预排序。当对数据进行请求时,数据库使用索引来标识数据存储在硬盘上的哪个位置,然后直接到达该位置。如果没有索引,则数据库需要查看每条记录,以查明它是否满足查询条件。
一种简单的查看索引的方法是考虑一副纸牌。一个没有被索引的数据库就像一个被洗牌的卡片组。如果要找到黑桃王,则需要一张一张地查看每张卡片。我们可能很幸运,它可能是第一个,或者我们可能很不幸,它可能是最后一个。
一个被索引的数据库,其中甲板上的所有牌都从ace到king排序,每个套件都放在自己的堆中。现在,寻找黑桃王变得更加简单,因为我们只需要查看包含黑桃的一堆纸牌的底部即可。
我希望这有帮助。请注意,尽管索引在关系数据库系统中是必需的,但是如果我们编写的索引过多,它们可能会降低生产效率。网络上有很多很棒的文章,我们可以阅读索引。我建议我们在阅读之前先做一些阅读。
对于mssql(可能还有其他),语法如下:
create index <indexname> on <tablename>(<column1>[,<column2>...])
一些更多的索引信息!
聚集索引是表中记录的实际物理布局。因此,每个表只能有一个。
非聚集索引是上述卡目录。当然,书籍是按特定顺序排列的,但是我们可以按书籍大小,页数或者字母姓氏排列目录中的卡片。
需要考虑的一些问题-创建太多索引是一个常见的陷阱。每次数据更新时,数据库都必须搜索并更新该索引,然后在该表上该新行的每个索引中插入一条记录。在交易系统中(想想:纽约证券交易所的股票交易!),这可能是应用程序的杀手er。
根据经验,索引应该位于我们在联接或者where子句中使用的任何字段上(如果索引具有足够的不同值以使值得使用索引,则只有少数可能值的字段不会从索引中受益)为什么尝试对位字段建立索引毫无意义)。
如果结构已经正式创建了主键(应该,我永远不会创建没有主键的表),那么根据定义,这些键将被索引,因为需要主键在其上具有唯一索引。人们通常会忘记他们必须索引外键,因为在建立外键关系时不会自动创建索引。由于外键的目的是为我们提供一个要联接的字段,因此大多数外键都应该建立索引。
一旦创建索引,就需要维护。如果我们有大量的数据更改活动,则它们可能会变得零散且性能降低,需要刷新。在线阅读有关索引的书籍。我们还可以在此处找到create index语句的语法。
索引是一种平衡行为,通常,添加的每个索引都会增加数据插入,更新和删除的时间,但可能会加快选择和连接复杂插入,更新和删除的时间。尽管上面的经验法则是一个很好的起点,但没有一个公式可以确定最佳的索引。
如前所述,我们可以有一个聚集索引和多个非聚集索引。在SQL 2005中,我们还可以将其他列添加到非聚集索引中,这样可以提高性能,因为索引中包含了一些通常检索到的列,但它们不是键的一部分,从而完全消除了访问表的麻烦。
用于确定SQL Server数据库正在执行什么工作的#1工具是探查器。我们可以分析整个工作负载,然后查看建议的索引。我们还可以查看执行计划,以了解索引有什么作用。
索引过多的问题是由于写入数据库,并且必须更新所有具有该行记录的索引。如果我们具有读取性能,则可能不是因为索引太多,而是因为索引太少或者不合适。