1 innodb的索引
可以把索引理解成一本书的目录,通过目录可以快速找到数据的页, 之后在页中查询到具体的数据,速度远远比从一本书的开始到结尾一页一页查询更快。
1)innodb索引分为2种:
聚簇索引: 所有记录都是通过主键大小排序的双向数据页, 底层数据页存储的是真实的数据记录, 通过主键查询的话, 只需要通过此聚簇索引就可以找到真实的数据记录;
二级索引: 通过索引列大小排序组成的双向数据页, 底层页中存储的行记录是由 索引列+主键 组成;
说明:
1)innodb索引即数据, 索引和数据是存储在一起的。
2)通过二级索引查询数据的时候, 需要先经过二级索引获取到主键, 在用获取的主键在聚簇索引中
查询数据, 要经过两个b+树,性能没有主键直接查询快。
2)表存储空间
通过表空间来存储所有表数据, 表数据中包含索引, 聚簇索引中存储着完整的表数据,二级索引中存储着索引列和主键信息。
当查询条件没有命中索引的时候,会在聚簇索引的页节点中按照数据页主键从小到大的顺序遍历匹配查询;
当查询条件根据主键查询时,直接在聚簇索引中根据二分法查询,快速定位到具体数据位置;
当查询条件根据索引列查询时,先在二级索引中根据二分法查询到索引列字段对应的主键, 在用主键在聚簇索引中根据二分法查询到具体数据;
2 聚簇索引
1) 索引分成根节点、内节点、叶节点
叶节点存储的是真实的数据记录;
内节点是目录页,存储的是下一层数据页的 主键最小值 + 页码;
根节点存储的也是目录页,下一层是它的子目录页, 只是对下一层目录页再次做了目录;
2)页中的结构
页中的记录是根据主键大小排序后的单向链表结构
3)叶节点数据页和内节点目录页的关系
目录页中记录存储的是 主键值+页码, 在目录页中根据二分法找到主键值后获取对应页码,根据页码找到对应数据页, 在数据页中在根据二分法先找到槽,槽中在遍历匹配到具体记录。
3 二级索引
索引的叶节点数据页中存储的是索引列+主键, 在二级索引中查询到索引列对应的主键后, 在用主键在聚簇索引中根据二分法找到具体的数据记录。根据索引列查找数据的方式和聚簇索引一样,此处不再详细介绍。
4 innodb没有索引的查询
列字段没有加索引, 会根据页的双向链表结构遍历一页一页的查询匹配, 一直到匹配到数据为止。
5 MYISAM的索引
myisam 索引和数据文件是分开的,无论是主键还是索引字段, 都要经过两个b+树才能查询到数据。
索引文件的数据页中存储的是 主键+行号, 在根据行号去数据文件中查询数据, 行号类似于地址偏移量,
使用地址偏移量查询数据的速度比用主键在聚簇索引中使用二分法查询速度快。