2012-02-14 82 views

回答

5

索引在SQL中如何工作以及它提供了哪些好处?

当您为列建立索引时,表达了您在条件表达式中查询索引列的意图,例如相等或范围查询。利用这些信息,存储引擎可以构建一个使这种查询更快的结构,通常将它们排列在树结构中。 B树是最常见的,但存在许多不同的结构,例如散列索引,空间数据的R树索引等。每个结构都专门用于某种类型的查找。例如,哈希索引是实现平等的条件非常快,例如:

SELECT * FROM example_table WHERE type = "example"; 
SELECT * FROM example_table WHERE id = X; 

B-树也是平等的外观起伏相当快,但它们的主要优点是它支持范围查询:

SELECT * FROM example_table WHERE id > 5 AND id < 10 
SELECT * FROM example_table WHERE type = "example" and value > 25 

是非常重要的,但是,当你建立B树索引明白,树是在“左到右”的方式订购。也就是说,如果您在{type,value}上构建B树索引(让它称为A),那么您需要在类型列上具有条件以便查询能够使用该索引。示例索引不能用于条件完全依赖于值的查询中。 此外,如果混合平等和范围条件,确保平等列列在指数第一,否则该索引只能部分使用。

会有不索引什么原因?

如果索引的选择性很低,那么在表扫描上可能没有太多的收获。比如说你有一个名为性别的字段的索引。那么该索引的选择性会很低,因为对该索引的查找将返回原表的一半行。你可以阅读选择一个非常简单的解释一下,和推理背后:http://mattfleming.com/node/192

同时,维持指标是有成本的。对于每个数据操作,索引可能需要重组。因此,将索引数量保持在针对该表的查询所需的最低要求可能是可取的。

索引单列与索引多列之间有什么区别?

再次,它取决于你发出查询的类型。索引单列性别可能不是一个好主意,因为选择性很低。当选择性高时,这样的指数更有意义。例如,主键上的索引是一个非常好的索引,因为选择性很高(实际上,索引中的每个键都对应于记录中的精确值),并且列上的索引具有唯一性或高度不同的值(例如slu,,密码哈希和不能)也是很好的单列索引。

还有覆盖指数的概念。基本上,索引中的每个叶子都包含一个指向存储该行的表的指针(除非索引是聚簇索引,在这种情况下叶是记录)。因此,对于每个索引命中,查询引擎必须获取相应的表行,从而增加I/O操作的数量。由于I/O速度非常慢,因此您希望将其降至最低。现在,假设您经常需要查询某些内容并获取一些额外的列,那么您可以创建一个覆盖索引,为查询性能交易存储空间。例如:让我们找到谁在过去6个月(假设MySQL的)参加了所有用户的姓名和电子邮件:

随着{joined_at}指数:

SELECT first_name, last_name, email 
FROM users 
WHERE joined_at > NOW() - INTERVAL 6 MONTH; 

查询解释:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  users ALL test   NULL NULL  NULL 873 Using where 

正如您在type栏中可以看到的那样,查询引擎使用了全表扫描,因为索引选择性太低而不适合在此查询中使用(将返回太多结果,因此会被追踪到表中,在I/O中花费太多)

随着{joined_at,名字,姓氏,电子邮件}指数:现在

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  users range test,test2  test2 8  NULL 514 Using where; 
                    Using index 

,因为一切必要完成查询的信息是在索引可用,查询引擎计算,这是更好地使用索引(514行)而不是进行全表扫描。因此,您可以看到,通过使用覆盖索引,我们可以加快部分表选择的查询速度,即使索引的选择性非常小。

2

如何在SQL

索引工作,这是一个相当开放的问题,而是基本数据库存储,允许更快的查找信息的结构。该结构取决于实现,但通常是一种树。

它提供了什么好处?

查询是优化搜索可以显著更快。*

会有不索引什么原因?

某些数据修改查询可能需要更长的时间,并且存在索引的存储成本,但一般来说,这两个考虑因素都可以忽略不计。

索引单列与索引多列之间有什么区别?

没有太大的差别,但有时人们创建覆盖索引**,索引多列以提高特定查询的性能。


*优化搜索是搜索参数ABLE。基本上如果你这样做WHERE FOO > 5它可以更快如果FOO索引。另一方面,WHERE h(FOO) > 5可能不会从索引中受益。

**如果在SELECT JOIN和WHERE语句中使用的所有字段也都在索引中,那么数据库可以检索它需要的所有信息而无需返回基表。这被称为覆盖指数。如果所有字段都在单独的索引中,那么它将仅使用连接的字段,然后返回基本表中的select列中的列。

+0

感谢您提供快速翔实的答案。你认为你可以为我详细解释一些吗? SARGable是什么意思?将多个列索引为单个索引,还是将这些相同的多个列索引在一起,有什么区别? – john 2012-02-14 22:47:32

+0

我已经更新了我的答案,将扩展包含在SARGable和Covering索引的思想中 – 2012-02-14 23:01:38