[英]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.