对于数据库mysql来说首先要明白的一个点为聚簇索引和非聚簇索引。

聚簇索引:数据与索引存储在一起并且是按照一定的顺序,找到索引也就可以找到数据。

非聚簇索引:数据与索引没有存放在一起,而是存放的磁盘地址

首先要了解mysql的常见的存储引擎:InnoDB,MyISAM,MEMORY,在此以innodb和MyIsam为例,innodb即为聚簇索引,MyIsam即为非聚簇索引。下面详细介绍。

1.Innodb与MyIsam的文件存储方式不同。Innodb中有两个文件存储:

.frm:表定义

.idb:存储数据与索引,在同一个文件中

而对于MyIsam则有三个文件进行存储:

.frm:表定义

.myd:存储数据

.myi:存储索引

由这一点可以很明显的看出innodb的数据与索引是存放在同一文件中而MyIsam的则是两个文件存储,在这里可以得到一个简单的结论,对于具体是什么的流程由下图说明。

1.由以上两个图可以看出,聚簇索引树的主键索引树的叶子节点存储的为主键+data数据,也就意味着可以根据主键直接查询出所需要的data数据 此为聚簇索引

2.而下图的非聚簇主键索引树可以明显的看出pk下不再存储data数据,存储的而是对应的MYD的数据磁盘地址,通过查询主键后再根据对应的磁盘地址查询数据,此为非聚簇索引

3.而对于回表操作来说,可以以聚簇主键索引树为例,除去主键索引其他的全部为二级索引,二级索引树下对应的不再是data数据,而是对应的主键,也就意味着通过普通索引查询出的是主键,再通过主键索引树查询出对应的数据,这个操作称之为回表操作。

4.覆盖索引也为不进行回表操作而诞生,比如当查询的sql为 select name from a where name = '1',当name为普通索引时,此时此条sql是并未进行回表操作的,因为索引树上存储的索引值就可以直接查询出所需要的数据,因为只需要select name,但是当sql变为了 select name,age from a where name ='1'时,索引还是name,此时需要进行回表操作,因为索引能够检索到的只有name = '1' 但是当前索引树中并未存储age的信息,而上边说的二级索引树对应的不再是data值,而是对应的主键,所以此时需要通过主键查询主键索引树得到age,此时则为回表。而覆盖索引可以将索引改为联合索引(name,age),此时索引树直接可以查询到所需要name与age数据,所以不再需要进行回表。

补充:当表未设计主键索引时,mysql会寻求一个合适的唯一索引来作为主键索引,当没有合适的唯一索引可以作为主键索引时,mysql会将隐藏列作为主键索引。

推荐链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。