繁体   English   中英

SQL索引和性能改进

[英]SQL Indexes and performance improvement

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

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

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

这是适用于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操作就越多(获取)因为所有这些指数都需要更新。

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

简单,我知道,但它可能是思考索引的良好开端。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM