mysql索引的演化
其实 mysql 索引最开始设计的是二叉树,这就有一个缺点,大的数据永远往右边插入,比如1234567,直接变成了链表
为了解决这个问题,引入了红黑树,read/black tree, 本质上是一个平衡二叉树,可以实现自我的平衡,不过也有缺点,如果数据量大的话,树的高度不可控。
这里要补充一下 mysql 索引使用的过程:
先拿到根节点(一次io),判断是否是要查询的数据,不是的话再往leftNode 或者 rightNode(一次io) ,以此类推,如果树很高的话,io次数会变多,效率就低下
B树,B+树 一个节点可以存储多个元素,默认16KB的存储大小,进行查找时,先加载一个节点到内容,随机查找,找到元素或者指针后再将下一个节点加载到内容。
B+树的数据都保存再叶子节点,且叶子节点之间指针维护顺序。
节点16KB是可以修改的,但是不建议,因为16KB是mysql长期测试得到的结果,3次IO就可以搞定2000W左右的数据,如果数据量再大就要考虑分库分表了。
mysql的索引结构
myisam 与 innodb 在索引上的区别:
innodb 有2个文件
- fm (表结构)
- index (索引和数据放在一起)
myisam 有3个文件
- fm (表结构)
- index
- data (索引和数据分开)
myisam 是典型的非聚集索引
为什么mysql要建一个主键?
如果没有主键 mysql会维护一个rowid 做主键,加大mysql的性能损耗
为什么建议主键设计成整型?
索引在查找的时候会有大量的比对操作,用整型一次就可以比对完成,
而字符串是需要逐位去比较的,太浪费性能,而且空间上来说更节约。
为什么建议主键设计成自增?
索引页是有大小限制的16KB,如果是无序插入,超过这个大小,会分裂。
而且B+树低层会帮忙把数据从大到小,从左到右维护,如果数据自增,插入的时候向后面添加就好,如果不是自增会出现插入的情况,造成额外的挪动。