1.什么是mysql索引
mysql的索引是一种排好序的数据结构,可通过索引快速检索到指定数据
2.mysql索引的数据结构和存储方式
mysql采用的是b+树数据结构来存储索引,并且将索引存储在磁盘中。在InnoDB引擎中索引b+树的叶子节点和非叶子节点都是用页来存储数据,页是InnoDB引擎中最小的存储单元,一页的大小默认是16KB。
常见的数据结构:
- 二叉树
- 红黑树
- b树
- b+树
- hash表
…
为什么mysql不采用其他的数据结构呢?b+树相对于其他数据结构有哪些优势?
- b+树的每一层可以容纳更多的节点,层级越小对磁盘的I/O就越少,速度就越快。假设一行数据的大小为1KB主键为bigint类型,非叶子节点存储主键(占8个字节)和指针(占6个字节),叶子节点存储每一行的数据。那么一页可以存储:16 * 1024 / 14 = 1170 个非叶子节点,一颗3层的b+树就能存储:1170 * 1170 * 16 = 21902400 个节点,这也是为什么一张表超过2000w行数据就建议分库分表的原因。
- b+树的叶子节点存储了相邻节点的指针,在范围查找时有较高的性能
3.什么是聚簇索引和非聚簇索引
- 聚簇索引和非聚簇索引体现在不同的引擎中,在InnoDB引擎中索引和数据是存放在同一个文件中所以叫聚簇索引,而在MyISAM引擎中索引和数据存放在不同文件中所以称为非聚簇索引,并且非聚簇索引的叶子节点存储的是主键和对应数据的磁盘地址,所以会有一次回表查询。
4.联合索引
- 顾名思义联合索引就是对多个字段建立一个索引,索引结构和二级索引结构类似,叶子节点存放的是主键和相应字段的值,相比于单独列索引可以节省更多的磁盘空间。联合索引按照索引的第一个字段排序,如果第一个字段的大小都一致那么就按照第二列的大小排序后续以此类推。在使用联合索引的时候我们还需要遵循最左匹配原则。