深入浅出数据库索引原理 数据库索引( 二 )
在谈完聚集索引之后,我们再来谈一谈非聚集索引,这是我们经常提到和使用的常规索引 。
与聚集索引一样,非聚集索引采用资源网络平衡树作为索引的数据结构 。索引树结构中每个节点的值来自表中的索引字段 。如果将索引添加到用户表的名称字段,则索引由名称字段中的值组成 。当数据发生变化时,数据库管理系统需要始终保持索引结构的正确性 。如果对表中的多个字段进行索引,将出现多个独立的索引结构,并且每个索引(非聚集索引)彼此不相关 。下图
文章插图
每次为字段创建新索引时,都会复制该字段中数据的副本,并用于生成索引 。因此,向表中添加索引会增加表的大小并占用空的磁盘存储空间 。
非聚集索引和聚集索引的区别在于,要搜索的数据可以通过聚集索引找到,而记录对应的主键值可以通过非聚集索引找到,然后利用主键的值通过聚集索引找到需要的数据,如下图所示 。
文章插图
无论如何查询表,最终都将使用主键通过聚集索引定位数据 。聚集索引(主键)是真正数据的唯一路径 。
但是,有一个例外:您可以在不使用聚集索引的情况下查询所需数据 。这种非主流的方法称为“覆盖索引”查询,通常称为复合索引或多字段索引查询 。文章的上述内容已经指出,为一个字段建立索引后,该字段的内容将同步到索引中的资源网络 。如果为索引指定了两个字段,这两个字段的内容将同步到索引 。
先看下面的SQL语句 。
//创建索引 。
在user_info(生日)上创建index index _生日;
//查询生日在1991年11月1日的用户的用户名 。
从user_info中选择user_name,其中生日= & # 39;1991-11-1'
这个SQL语句的执行过程如下 。
首先,通过非聚集索引index _生日查找生日等于1991年11月1日的所有记录的主键ID值 。
然后,通过获得的主键标识值进行聚集索引搜索,找到主键标识值对应的真实数据(数据行)的存储位置 。
最后,从真实数据中获取user_name字段的值,即得到最终结果 。
我们将生日字段上的索引更改为双字段覆盖索引 。
在user_info(生日、user_name)上创建index index _生日_和_ user _ name
这个SQL语句的执行变成 。
生日等于11/1/1991的叶节点的内容通过非聚集索引index _生日_和_用户名进行搜索 。但是,除了user_name表的主键ID的值之外,user_name字段的值也在叶节点中,因此不需要通过主键ID值来搜索数据行的真实位置,而是直接获取叶节点中user_name的值并返回 。通过这种覆盖索引的直接搜索方式,可以省去最后两个没有覆盖索引的搜索步骤,大大提高了查询性能,如下图所示 。
文章插图
该指数的一般工作原理如本文所述,但在细节上可能略有偏差,这不会影响概念阐述的结果 。
【深入浅出数据库索引原理 数据库索引】
推荐阅读
- 功能齐全的 MySQL 数据库管理工具
- 如何设计字段?你需要知道数据库设计范式
- SQLSERVER如何分离和附加数据库
- 如何使用Ora2Pg迁移Oracle数据库到openGauss
- 如何用MySQL创建一个数据库
- t3 insert into语句 数据库insert into语句
- 为什么搜索引擎可以搜索到那么多东西?
- 乒乓球技术汇总数据库! 乒乓球基本技术
- mysql索引的数据结构,为什么用B+树不用B树 mysqlb+树索引
- Mysql索引原理-简书 深入理解mysql索引