SQL索引和性能改进

时间:2011-04-04 18:50:27

标签: sql indexing

我对SQL索引以及它们如何提高性能有一些疑问。希望你们能回答他们! :d

  • 创建整个表的索引以及我的表和几列的索引有什么区别?那些只指定了几列的索引会更快吗?

3 个答案:

答案 0 :(得分:25)

您没有指定您正在使用的数据库系统 - 这些事情总是非常特定于供应商。

以下是适用于SQL Server的专有技术:

首先,SQL Server中的索引在其索引条目中最多只能有900个字节。仅这一点就不可能有一个包含所有列的索引。

最重要的是:这样的索引完全没有意义。你想要实现什么?

请考虑一下:如果您在(LastName, FirstName, Street, City)上有索引,该索引将能够用于加速查询

  • FirstName
  • City
  • Street

该索引对于

上的搜索非常有用
  • (LastName)
  • (LastName, FirstName)
  • (LastName, FirstName, Street)
  • (LastName, FirstName, Street, City)

但实际上没有别的 - 如果你只搜索Street或只搜索City,肯定不会!

索引中列的顺序有很大不同,查询优化器不能只使用索引中间某处的任何列进行查找。

考虑一下你的电话簿:它的订单可能是LastName,FirstName,也许是Street。那么索引是否可以帮助您找到您所在城市的所有“Joe's”?所有人都住在“主街”?不 - 您可以先通过LastName查找 - 然后在该组数据中获得更具体的信息。只对所有内容编制索引并没有帮助加快搜索所有列。

如果您希望能够按Street进行搜索,则需要在(Street)上添加一个单独的索引(可能还有一两个有意义的列)。

如果您希望能够按Occupation或其他任何方式进行搜索,则需要另外一个特定索引。

仅仅因为您的列存在于索引中并不意味着“会加快该列的所有搜索速度!”

主要规则是:使用尽可能少的索引 - 对于一个系统来说,太多的索引可能比没有索引更糟糕了......构建你的系统,监控它的性能,并找到那些花费成本的查询大多数 - 然后优化这些,例如通过添加索引。

不要只是因为你可以盲目索引每一列 - 这是糟糕的系统性能的保证 - 任何索引也需要维护和维护,所以你拥有的索引越多,你的INSERT,UPDATE和DELETE操作就越多因为所有这些指数都需要更新,所以会受到影响(变慢)。

答案 1 :(得分:3)

有关于这个主题的整本书都写了,但是最简单的说法我现在可以想到,索引返回结果的速度更快,因为它们按照你想要的顺序排序(所以记录可以找到它们更小,因此必须扫描更少的块来读取你想要的索引记录。

我知道简单,但考虑索引可能是一个好的开始。

在回答您的具体问题时,通常您不会创建整个表的索引。如果索引中只有几列,则可以通过两种方式获得改进。 A)可以更快地找到记录,因为它们按预定义的顺序并且可以使用良好的搜索例程,并且B)您甚至可能不必去实际的表来返回您的数据 - 它可能已经在索引本身。

答案 2 :(得分:1)

您需要了解表格中的数据以及如何访问这些数据。例如,如果您的表格中有一些日期列“mydate”,那么您的系统将根据日期查询您的表格,例如“SELECT * FROM my_table WHERE mydate BETWEEN'2002-01-31'和'2003-05-14'”,然后数据库可以根据“mydate”列索引有效地获取查询行。

如果没有索引,数据库需要扫描整个表以查找满足查询的所有行。如果你的表有100行,那么全表扫描并不是什么大问题。如果你有250万行,那么全表扫描是一件大事。