我是否必须时不时地创建某个非聚集索引?

时间:2013-09-27 18:54:24

标签: mysql sql sql-server database database-indexes

我有一个拥有超过5000万条记录的数据库表,为了改善搜索,我必须创建一个非聚集索引,一旦我创建一个,需要5~10分钟才能创建,所以我想在后台进行排序根据指数的数据。

所以例如在向我的表添加索引之前,搜索很糟糕并且需要很长时间,当我添加非聚集索引时,搜索很快。

但那只是在我有5000万条记录的时候。

问题是,如果在向表中添加任何数据之前创建表时最初定义了索引,该怎么办?它会提供我现在正在获得的相同搜索性能吗?或者我是否必须不时删除并重新创建索引以定期对数据进行排序?

我很抱歉,如果我的问题看起来很愚蠢,我刚开始学习索引,对我来说这是一个令人困惑的主题。

4 个答案:

答案 0 :(得分:4)

非聚集索引将索引字段的副本保存在为搜索而优化的特殊结构中。在5000万条记录上创建索引显然需要一些时间。

创建索引后,它会在添加,删除或更新记录时自动维护,因此如果系统或磁盘严重崩溃,您只需要重新索引。

一般来说,最好在创建表时创建索引。

有一项称为“更新统计信息”的操作可帮助查询优化器提高其搜索性能。数据库引擎的细节有所不同。

答案 1 :(得分:3)

数据库索引的工作方式类似于书籍。

它实际上是指向表中右侧行的指针,基于特定键(您为其定义索引的列)进行排序和排序。

所以,基本上,是的,如果你在插入数据之前创建索引,那么当你的表加载了大量记录时,你应该在以后使用它时获得相同的搜索速度。

虽然,每次插入(或删除或更新特定键)索引都需要更新时,插入(或删除或更新)大量数据会慢一点。

如果您在表上执行大量插入和删除操作,索引可能会碎片化。因此,删除和重新创建它们通常是良好维护计划的一部分。

答案 2 :(得分:2)

查看ola hallengren的免费脚本。一个是关于索引维护和统计数据。

一般经验法则,

指数碎片在10到30%之间,重新组织。

碎片> = 30 pct,重建。

重新组织。您需要更新统计信息。

重建会自动完成。

索引是优化查询性能的重要部分。

  • 约翰

http://ola.hallengren.com/

答案 3 :(得分:1)

可以在将数据插入相关表之前创建索引。假设更新触及相关索引中涉及的字段,则每次插入或更新行时都会更新索引。

插入行时,索引可能会碎片化,以允许索引在索引中维护所需的逻辑顺序。例如,如果索引包含A,B和E等行,并且您添加了包含C或D的行,则将拆分索引,以便新行适合B和E之间。可以使用Olla Hallengren的脚本作为Crafty修复此碎片DBA在他的回答中提到,但是根据你的系统存储配置方式,这可能是无效的。

帮自己一个忙,并查看http://www.brentozar.com/sql/index-all-about-sql-server-indexes/以获取有关SQL Server索引的一些优秀信息。