要设计一个适合 MySQL 索引的数据结构,至少满足以下要求:
- 尽可能的少进行I/O操作
- 能够高效的进行单个数据查询,也能高效的进行范围查询
二叉树
如果数据都是从小到大插入,二叉树就会退化成链表
红黑树
数据量过大时,树的高度会越来越高
b Tree
不适合做范围查询
b+ Tree
- 查询某个数据效率高且稳定
- 支持范围查找
- 千万级别数据量树高能控制在3-4层
为什么mysql默认使用innodb作为搜索引擎?
- MyISAM 引擎是把索引和数据分开存放,通过索引查到数据之后还要进行一次回表操作
- innodb则是把索引和数据都存放在了一起,查找到了索引之后可以直接拿到数据
为什么mysql推荐一定要设定索引,最好使用整型且设定自增主键
- 一定要设定索引:如果不设定索引,mysql会找表中的某一列中不重复的值作为主键索引,如果没有找到就会自动生成一个隐藏列作为索引,加大了mysql自身的工作量
- 整型主键:整型的比较比字符串的比较效率更高,如果使用uuid作为主键,还要将uuid转化成ACSI码逐个去比对,效率大大折扣
- 自增索引:如果是自增索引,数据再插入的时候会往后面排,mysql维护B+树的时候会尽可能的减少自身的平衡,且树的分裂次数会比较少,如果使用了非自增主键,例如uuid,那它的插入顺序可能是随机的,可能会往中间插入,B+树会对插入的数据进行分裂以及自平衡的操作,这比自增的索引工作量更大,从而降低了性能