MySQL中的聚簇索引和非聚簇索引


MySQL中的聚簇索引和非聚簇索引



索引(Index )是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的 SQL 性能问题。索引是帮助 MySQL 高效获取数据的数据结构,它用于快速找出在某个列中含有某一特定值的行。如果不使用索引,那么 MySQL 必须从第 1 条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,那么 MySQL 就能快速到达一个位置去搜寻数据文件的中间, 没有必要 遍历 所有数据。

索引 MySQL 中也叫做“键( key )”, 索引 是存储引擎用于快速找到记录的一种数据结构。总体来说,索引有如下几个优点:

①  索引大大减少了服务器需要扫描的数据量。

②  索引可以帮助服务器避免排序和临时表。

③  索引可以将随机I/O 变为顺序 I/O

 

索引的本质是空间换时间 ,通过索引这个缓存来提高数据查询的效率。 MySQL 中, 每一个索引在InnoDB 里面对应一棵 B+ 树, MySQL InnoDB 索引数据结构是 B+ 树,主键索引叶子节点存储的就是 MySQL 整个 数据行,普通索引的叶子节点存储的是 索引列和 主键值。


  1   什么是聚 索引(clustered index )和非 聚簇索引(non-clustered index

从物理存储角度 来分, 索引 可以 分为聚簇索引和非聚簇索引 区别主要看叶子节点存了什么数据

InnoDB 里,索引 B+Tree 的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引 因为 数据一旦存储,顺序只能有一种。找到了索引就找到了需要的数据,那么这个索引就是聚簇索引,所以主键就是聚簇索引,修改聚簇索引其实就是修改主键。

索引B+Tree 的叶子节点 存储了主键的值 和索引列 的是非主键索引,也被称之为非聚簇索引。一个表可以有多个非聚簇索引 非聚簇 索引的存储和数据的存储是分离的,也就是说 可能 找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚簇索引也叫做辅助索引。

聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。

聚簇索引查询相对会更快一些,因为主键索引树的叶子节点直接就是我们要查询的整行数据了 而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询(这个过程叫做回表 也就是查了2 个索引树)。

例如, 下面 SQL 创建了一个学生表

create table lhrdb.student (
    id bigint,
    no varchar(20) ,
    name varchar(20) ,
    address varchar(20) ,
    PRIMARY KEY (`id`),
    UNIQUE KEY `idx_no` (`no`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

对于如下的SQL 语句, 直接根据主键查询 获取 所有字段数据,此时主键 聚簇索引,因为主键对应的索引叶子节点存储了id=1 的所有字段的值

select * from lhrdb.student where id = 1;

对于如下的SQL 语句, 根据编号 no 查询编号和名称,编号本身是一个唯一索引,但查询的列包含了学生编号和学生名称,当命中编号索引时,该索引的节点的数据存储的是主键ID ,需要根据主键 ID 重新查询一次,所以这种查询下 no 不是聚簇索引

select no,name from student where no = 'test';

对于如下的SQL 语句, 根据编号查询编号,这种查询命中编号索引时,直接返回编号,因为所需要的数据就是该索引,不需要回表查询,这种场景下no 是聚簇索引

select no from student where no = 'test';

主键一定是聚簇索引, 如果开发 人员不手动设置 主键 那么MySQL 默认 使用 非空的 Unique 索引, 没有 非空的 Unique 索引,则会使用数据库内部的一个行的 id 来当作主键索引 其它普通索引需要区分SQL 场景,当 SQL 查询的列就是索引本身时,我们称这种场景下该普通索引也可以叫做聚簇索引, MyisAM 引擎没有聚簇索引。

 




About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub、博客园、CSDN和个人微 信公众号( DB宝)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 、618766405

● 微 信群:可加我微 信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2020-05-01 06:00 ~ 2020-05-30 24:00 在西安完成

● 最新修改时间:2020-05-01 06:00 ~ 2020-05-30 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( DB宝)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



请使用浏览器的分享功能分享到微信等