聚簇索引和非聚簇索引

在Mysql中,有两大常用的存储引擎MyisAm和Innodb,聚集索引和非聚集索引用的是B+树索引
InnoDb使用的是聚集索引,Myisam使用的是非聚集索引也叫非聚簇索引

一、聚集索引也叫聚簇索引
     1、聚集索引的缺点是修改时需要保持表中记录和索引的顺序需要一致,在插入新记录的时候就会对数据也重新做一次排序
     2、表纪录的排列顺序和索引排列顺序保持一致,由于连续存放 所以查询效率相当快
     3、数据表创建上INNODB聚集索引存储的是一个文件,后缀为.frm  、ibd数据
     innodb引擎通过搜索树方式实现索引,索引类型分为主键索引(聚集索引)和 二级索引(非主键索引)
     主键索引树中,叶子结点保存着主键即对应行的全部数据
     二级索引树中,叶子结点保存着索引值和主键值(先通过普通索引定位到主键值id=1;在通过主键索引定位到行记录;这个过程会有回表查询)
     当使用二级索引进行查询时,需要进行回表操作

     避免回表方式:
     覆盖索引: 查询的列和查询条件的列全部包含在一个索引中,可以直接使用索引查询而不需要回表。这就是覆盖索引
     覆盖索引是指索引中的列包含了数据处理中涉及的所有列,覆盖索引相当原始表的一个子集
     通过使用覆盖索引,可以减少搜索树的次数,是常用的性能优化手段
例1:
    name是一个索引:select id from table where name = aaa
    由于name索引树的叶子结点上保存有name和id的值,通过name索引树查找到id后 就不需要在主键索引去查找了
例2:name是一个索引:select pwd from user_table where name = aaa
    1、name索引树上找到name=aaa对应的主键id
    2、通过回表在主键索引树上找到满足条件的数据
    可以组建联合索引(name, pwd),这样,查询的时候就不需要再去回表操作了,可以提高查询效率

注意在做覆盖时的前缀索引:
    mysql的b+树索引遵循“最左前缀”原则
    联合索引(name,pwd)注意查询顺序
    例1:where name = '张三' and pwd = '123'

二、非聚集索引
    1、非聚集索引的索引的层次比较多,但是不会造成数据的重排
    2、数据表创建上Myisam存储为三个文件.frm(表结构)、.MYD(数据)、.MYI(索引)
    3、MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址
    非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,二级索引无需再根据ID索引
    根据MYI文件里存储的物理地址 - > 找到对应的数据

posted @ 2020-02-23 18:57  吴某1  阅读(425)  评论(0编辑  收藏  举报