1、什么是索引
索引是帮助mysql高效获取数据的排好序的数据结构,本质:数据结构
2、索引的数据结构?
从InnoDB和MyISAM引擎出发,两者都是以B+树为索引存储结构。
区别在于MyISAM引擎中,B+树的叶子节点data域存储的是数据的物理地址(索引结构和数据结构其实是分开存储的,主要看.frm、.myi、myd结尾的文件);InnoDB引擎中,B+树的数据存储在叶子节点,非叶子节点存储索引,InnoDB对数据的存储必须依赖主键,而主键对应的索引
2.1、B+树
B+树就像文件系统一样,需要一级一级的查找目录,在最后一层找到对应的文件;B+树的非叶子节点只存储索引,不存数据,而叶子节点存储数据、指向相邻叶子节点的指针从而形成了一个有序的链表
2.2、B树(B-树)
B树是B+树的前身,B树的非叶子节点也包含了查找的数据
2.3、哈希索引
是基于hash表实现的,对于查找某一列的数据,速度很快,不适合查找行。
hash索引值包含哈希值和行指针,不存储字段值;hash索引数据并不是按照索引值的顺序存储的,所以无法用于排序;hash索引只支持等值查找,不支持范围查找;访问hash索引的数据非常快,除非有很多hash冲突(不同的索引列值有相同的hash值),当出现hash冲突时,存储引擎必须遍历链表中所有的行指针,逐行进行比较
注:为什么选择B+树而不选择B树
B+树的磁盘读写代价更低:B+树非叶子节点不存储数据,索引非叶子节点的存储相比B树所消耗的存储容量更少,
B+树对范围查询的支持更好:B+树所有数据都在叶子节点上,非叶子节点上存索引,那么做范围查找的时候只需要扫描一遍叶子节点即可;而B树因为非叶子节点也保存数据,范围查询的时候要找到具体数据还需要进行一次中序遍历
......
3、索引的类型
主键索引
聚簇索引:
非聚簇索引:
二级索引(非主键索引)
指的是除了主键索引外的索引。主键索引和所有二级索引都各自维护各自的B+树结构,但是有个不同的地方在于,二级索引的叶子节点存的不是数据,而是主键索引对应的主键值,即二级索引不再保存一份data数据,而是去主键索引中查数据,那么对于二级索引查找一条数据的流程是这样的:
1、首先在二级索引中找到叶子节点对应的数据主键值
2、根据这个主键值去聚簇索引中找到真正对应的数据行
覆盖索引
只查询索引就能获取到数据不必再回表查询,即查询的列被索引列覆盖
优点:
1、索引项通常比记录要小,索引mysql访问更少的数据
2、索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O
3、对于InnoDB表尤其有用,因为InnoDB使用聚簇索引组织数据,如果二级索引中包含查询所需的数据,就不在需要在聚簇索引中查找了
4、覆盖索引不能是任何索引,只有Btree索引存储相应的值。而且不同的存储引擎实现覆盖索引的方式都是不同的,并不是所有存储引擎都支持覆盖索引的
联合索引
对多个列建立一个索引,这种索引被称为联合索引