MySQL常见问题总结(持续更新)
b树和b+树的区别?MySQL为什么是用b+树存储索引?
- b+树非叶子节点只存储索引数据,不存储其他数据;真实数据全部存储在叶子节点
- b+树叶子节点通过双向指针链接,方便范围查找
- b+树非叶子节点可以存储更多的数据,相同层级可以存储更大量的数据
为什么推荐创建主键?主键为什么建议整形自增ID类型?
- innodb存储引擎需要有一个主键索引,如果自己不创建主键的话,MySQL需要检测数据选择一个数据唯一的行作为主键,找不到的话会生成一个隐藏行作为主键用于构建聚簇索引,
影响MySQL性能 - 构建的b+树是从左到右依次递增的数据结构,如果主键不是自增之间,添加数据时可能涉及频繁的索引结构的平衡操作,影响插入的性能
- 使用整形数据的原因是整形在进行大小比较的时候性能较高。
什么是聚簇索引和非聚簇索引?
- 聚簇索引:叶子节点存储完整数据的索引就是聚簇索引;例如innodb的主键索引
- 非聚簇索引:完整数据和索引分开存储的索引;例如myisam对应的索引以及innodb中的普通索引
什么是最左前缀?什么是聚合索引?为什么聚合索引使用必须符合最左前缀原则?
- 聚合索引:多个字段共同组成的索引就是组合索引;防止使用过多的索引树,影响数据新增和修改的性能
- 最左前缀原则:联合索引进行排序时,先使用最左面的字段进行排序,数据一致时再利用后面的字段进行排序
- 联合索引为什么使用最左前缀: 如果不按照最左前缀进行查询,例如直接使用第二个字段进行查找,在b+树上面是无序的,索引失效需要全表扫描
什么是回表查询?
- 回表查询就是想要查询的字段只在普通索引树上面不能全部获取,需要根据主键id去主键索引树上面进行查询,这个查询操作就是回标查询;有时为了提高查询的效率可以让查询
的所有字段在普通索引数即可获取到,不用回表查询从而提高性能,不过需要按照实际情况进行分析决定。