MYSQL索引
主键索引
任何表都有主键(没有默认创建隐藏的主键列),按主键字段排序,分数据页组用二分查询,目录页太多继续分组。实际一个索引就是1个B+数
叶子节点存储所有记录的完整信息,非节点存储主键和下个数据页地址。
数据页的大小为16kb
普通索引
和主键索引树类似,按普通字段排序,只要存储下个数据页地址 、主键和普通字段而不用完整记录(浪费磁盘)。
找到主键id再用主键索引回表查询,回表查询耗用性能(数据页不在内存中,需磁盘加载到内存)
联合索引
A,B
where A=‘’
where A=‘’ and B=‘’
where B=‘’
与普通索引类似,只是联合排序,先排序A,再排序B,单独查询B字段不会生效索引,遵循最左原则。节点存储下个数据页地址 、主键、A、B
explain
可以分析select查询优化器实际是否用到索引,还是全表扫描。优化器会把不使用索引,和使用给个索引的效率比较取最好的方案。
索引的使用
- 离散度很低的列无需创建索引,where后面的字段一般创建索引,不用大量创建索引,删除新增修改都要维护目录的改动,还大量占用磁盘,很大的字段也不该创建索引
- 利用联合索引,把重要的字段放最左边,无需单独创建多个普通索引
- 对于创建的索引,避免其失效,or 、对索引列 函数操作,类型转换都会导致主键失效。
参考视频:https://www.bilibili.com/video/BV1de4y1r7W4/?spm_id_from=333.788&vd_source=530c13983408581426f5b6d00155ba90