mysql B+树索引使用要点
这篇文章是自己学习mysql随手写的杂记,编辑混乱且不够严谨,请勿参考,谢谢!
我们知道引入索引是为了快速查询,但是往往一个系统或者软件引入了新的模块、功能或者组件,虽然丰富了产品特性,但是不可以避免的提升了系统或软件的复杂性和耦合性。因此要正确的使用索引,必须清楚其背后的原理。
B+树索引并不是建的越多越好,因为:
- 空间上,B+树的每个节点对应一个数据页,一个页大小为16KB,节点越多,越占用空间。
- 时间上,对数据表的增、删、改操作都可能会引起表记录的移动和"页分裂",而这会带来性能损耗。
只有索引列的有序才能使用使用二分查找快速定位记录。
二级索引B+树中,即使查询中使用了索引列,但实际查询时也未必会用到列索引。mysql查询优化器会根据表不同访问策略的成本选择最低的去执行真正的查询。比如,如果二级索引进行范围查找的记录非常多,那么查找完整用户记录则需要回表,如果全表扫描比回表的效率更高的话,会选择全部扫描。
在二级索引中的叶子节点中,存储的索引列+主键,因索引列是从小到大升序排序的,页之间很可能物理上连续,在进行索引列范围匹配时进行的IO是顺序进行的,这就是顺序IO。而回表时,需要通过主键查询完整用户记录,但是主键很可能不是连续的,此时需要访问不同且不连续的数据页,这就造成了随机IO。随机IO的效率是低于顺序IO的。
关于主键自增,为什么要设置自增,因为页中的记录是按主键从小到大排序的,只有排序才能使用二分查找算法,如果主键不自增,为了使页内部记录有序及页之间记录有序,则需要移动记录,页中空间不够存放新记录则还需要进行"页分裂"。很损耗性能,因此为了最大程度利用有序性的优势,建议定义主键时自增。
什么情况下使用索引生效?下面总结的很好,来自网上:
使用索引需要注意的点:
完。