SQL索引:无、单列和多列

SQL索引:无、单列和多列,sql,indexing,Sql,Indexing,在SQL中索引是如何工作的?它提供了什么好处?没有索引的原因是什么?为单个列编制索引与为多个列编制索引有什么区别 在SQL中索引是如何工作的 这是一个相当开放的问题,但基本上数据库存储的结构可以更快地查找信息。该结构取决于实现,但它通常是一种树 它提供了什么好处 可搜索的查询可以大大加快速度* 没有索引的原因是什么 有些数据修改查询可能需要更长的时间,而且索引需要存储成本,但一般来说,这两个方面的考虑都可以忽略不计 为单个列编制索引与为多个列编制索引有什么区别 虽然没有太大区别,但有时人们会创建

在SQL中索引是如何工作的?它提供了什么好处?没有索引的原因是什么?为单个列编制索引与为多个列编制索引有什么区别

在SQL中索引是如何工作的

这是一个相当开放的问题,但基本上数据库存储的结构可以更快地查找信息。该结构取决于实现,但它通常是一种树

它提供了什么好处

可搜索的查询可以大大加快速度*

没有索引的原因是什么

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

为单个列编制索引与为多个列编制索引有什么区别

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

*SARGable来自搜索参数。基本上,如果您在FOO>5的位置执行操作,那么如果对FOO进行索引,速度会更快。另一方面,hFOO>5可能不会受益于指数

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

在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
查询说明:

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,first_name,last_name,email}:

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行的索引,而不是执行完整的表扫描。
正如您所看到的,通过使用覆盖索引,我们可以加快查询表的部分选择,即使索引的选择性很小。

感谢您快速提供信息性的答案。你能为我详细介绍一下吗?萨尔盖博是什么意思?将多个列作为单个索引索引与将这些相同的多个列的一个索引放在一起有什么区别?我已经更新了我的答案,包括对SARGable和Covering索引思想的扩展
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