索引是什么
索引是帮助mysql高速查询数据的排好序的数据结构。一般使用的是一种特殊的B+树,还可以使用HasH树
索引能干什么和为什么要使用
索引用于快速查找具有特定列值的行。如果没有索引,mysql必须从第一行开始扫描查找,然后全表扫描来查找到
所有需要的值。表越大,需要花费越大,磁盘io越多,速度越慢。如果通过索引查找可以快速定位到需要查找的数据
,而不需全部扫描。
索引结构
MyISAM
MyISAM的存储结构分为 .frm用于存储表结构、.MYD用于存储数据、.MYI用于存储索引
myisam的索引和数据时存储到不同的文件中的,属性非聚簇索引。主键索引和普通索引可以说是没有什么区别的,要说有区别,也就是主键索引肯定不可为null,数据不可重复,可以实现主键自增。
索引树非叶子结点只存放索引值,叶子结点存储包含了索引对应数据的行的地址。
执行流程是先在索引树快速扫描到行的地址,然后直接通过扫描到的地址去数据文件(.MYI)中直接定位到需要的行,不需要逐行扫描,大大提高了查询速度。
InnoDB
InnodDB存储结构包含.frm文件用于存储表结构和.ibd文件用于存储索引和数据
InnoDB的索引和数据是存储到一个文件中,而且表数据在主键索引树上,所以innodb的索引属于聚簇索引
主键索引
主键索引非叶子结点只保存了主键,叶子结点是对应主键的数据行。
普通索引树结构
普通索引树,非叶子结点只保存普通索引值,而叶子结点上保存了普通索引和对应的主键
普通索引执行流程:先扫描普通索引树,找到对应的主键,然后去主键索引树中扫描对应的数据