索引是帮助MySQL高效获取数据的数据结构。
索引的本质:索引是数据结构。可以简单的理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。
1、提高数据检索的效率,降低数据库的IO成本。
2、通过创建唯一的索引,可以保证数据库表中每一行数据的唯一性。
3、在实现数据的参考完整性方面,可以加速表和表之间的连接。对于有依赖性子表和父表联合查询时,可以提高查询速度。
4、在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间,降低了CPU的消耗。
1、非叶子节点仅具有索引作用,也就是说,非叶子节点只能存储Key,不能存储value。
2、树的所有叶节点构成一个有序链表,可以按照key排序的次序依次遍历全部数据。
MySQL中InnoDB页的大小默认是16KB。
计算机在存储数据的时候,最小存储单元是扇区,一个扇区的大小是 512 字节,而文件系统(例如 XFS/EXT4)最小单元是块,一个块的大小是 4KB。InnoDB 引擎存储数据的时候,是以页为单位的,每个数据页的大小默认是16KB,即四个块。
在B+树中,一个结点就是一页。非叶子结点由主键值和一个指向下一层的地址的指针组成的组合组成。叶子结点中由一组键值对和一个指向该层下一页的指针组成,键值对存储的主键值和数据。
由存储结构,可以大概计算出一个B+树能存储的数据数量。
指针在InnoDB中为6字节,假设主键的类型是BIGINT占8字节,总共占14字节。
计算出一个非叶子结点可以存储16 * 1024 / 14 = 1170个索引指针。
假设一条数据的大小是1KB,么一个叶子结点可以存储16条数据。
得出两层B+树可以存储1170 x 16 = 18720 条数据。
三层B+树可以存储1170 x 1170 x 16 = 21902400条数据。