索引在SQL中如何工作以及它提供了哪些好处?没有索引的原因是什么?索引单个列与索引多个列有什么区别?SQL索引:无,单列和多列
回答
索引在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行)而不是进行全表扫描。因此,您可以看到,通过使用覆盖索引,我们可以加快部分表选择的查询速度,即使索引的选择性非常小。
如何在SQL
索引工作,这是一个相当开放的问题,而是基本数据库存储,允许更快的查找信息的结构。该结构取决于实现,但通常是一种树。
它提供了什么好处?
查询是优化搜索可以显著更快。*
会有不索引什么原因?
某些数据修改查询可能需要更长的时间,并且存在索引的存储成本,但一般来说,这两个考虑因素都可以忽略不计。
索引单列与索引多列之间有什么区别?
没有太大的差别,但有时人们创建覆盖索引**,索引多列以提高特定查询的性能。
*优化搜索是搜索参数ABLE。基本上如果你这样做WHERE FOO > 5
它可以更快如果FOO索引。另一方面,WHERE h(FOO) > 5
可能不会从索引中受益。
**如果在SELECT JOIN和WHERE语句中使用的所有字段也都在索引中,那么数据库可以检索它需要的所有信息而无需返回基表。这被称为覆盖指数。如果所有字段都在单独的索引中,那么它将仅使用连接的字段,然后返回基本表中的select列中的列。
- 1. 单独列索引VS多
- 2. 索引多列
- 3. 我应该使用多个单列索引还是单个多列索引?
- 4. PostgreSQL单列索引与多列索引优化SELECT性能
- 5. 多列索引列顺序
- 6. sql server 2008无效的列索引0
- 7. 多列索引VS多个索引
- 8. 多列mysql索引
- 9. MYSQL多列索引
- 10. MySQL多列索引
- 11. Grails多列索引
- 12. 多列索引搜索Microsoft.Isam.Esent
- 13. 多列索引或者时间序列MySQL表多个索引?
- 14. 列索引和sql分析器
- 15. 2列或多个索引上的SQL-1索引
- 16. 索引总和列
- 17. 使用Rails/Postgresql索引多列索引
- 18. SQL索引在两列
- 19. SQL Server索引 - 列顺序
- 20. 多维数组索引和列访问
- 21. HSQLDB索引和多列约束
- 22. Z索引和多个下拉列表
- 23. NHibernate列表键列上的SQL索引?
- 24. 根据列名获取SQL列索引
- 25. 多列索引和SQL查询的顺序
- 26. 包含许多列的SQL Server宽索引包含列
- 27. java.sql.SQLException:列索引无效
- 28. java.sql.sqlexception无效列索引
- 29. 列索引无效PLSQL块
- 30. 多列索引的顺序
感谢您提供快速翔实的答案。你认为你可以为我详细解释一些吗? SARGable是什么意思?将多个列索引为单个索引,还是将这些相同的多个列索引在一起,有什么区别? – john 2012-02-14 22:47:32
我已经更新了我的答案,将扩展包含在SARGable和Covering索引的思想中 – 2012-02-14 23:01:38