1,mysql索引原理:
hash:通过索引的计算定位到数据的存储的位置,进行一次I/O即可,效率非常高,但是是适合用于等值查询,范围查询索引是不起作用。
B+bree:MySQL的b+tree不是b-tree,而是在b-tree上进行了优化,所有的data都放在了叶节点,目的是为了使根节点存储更多的索引key值,mysql默认每一节点层是存储16k的数据,假设:存储的主键索引是bigint类型,默认是8b大小,而存储子节点的地址是6b,总共14b。16kb/14b=1170,所以根节点可以存储1170个key,假设有三层的话,默认存储的数据1k的话,那么叶节点可以存储16个数据,1170*1170*16=两千一百多万,两千多万的数据只需要三次I/O就可以找到,而现在有个问题,如果我要范围查询怎么办?因为b+tree所有的data都是放在最后的叶节点上,每个叶节点都是根据索引的顺序存放的,并且每个叶节点跟叶节点是有相互引用的指针。所有范围查询可以快速找到,
2,问题:uuid和自增长id那个存储效率高?
因为mysql的b+bree的data是根据索引的顺序存放的,如果是自增长id的话,每次插入数据直接插入尾部就可以了,效率很高,而如果是uuid的话,因为uuid是一段字符串,当插入表中时,会根据字符串排序,判断该插入b+bree的哪个位置,这个位置也是不确定的,但要如果插入的叶节点的数据已经存储满了,这时候会出现b+tree分裂的情况。b+bree重排问题,所以效率非常低。
3,表级别的存储引擎myisam和innodb的b+tree区别
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,InnoDB的数据文件本身就是索引文件。所以InnoDB表必须有一个主键,如果没有创建主键的话,mysql会默认帮你创建一个主键,而它的表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据,也就是主键对应的一行的记录,myisam是“非聚集”索引,InnoDB是聚集索引。
myisam
innodb: