索引介绍
官方介绍索引是帮助MySQL高效获取数据的数据结构
- 优势:
检索:可以提高数据检索的效率,降低数据库的IO成本;
排序:被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些,如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多;
where 索引列在存储引擎层被处理,达到索引下推效果; - 劣势: 占据磁盘空间; 索引虽然会提高查询效率,但是会降低更新表的效率;比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
索引分类
- 单列索引
- 组合索引
- 全文索引(mysql支持差,es代替较多)
- 空间索引(5.7之后的版本)
索引原理
- B和B+的区别
B树和B+树的最大区别在于非叶子节点是否存储数据的问题。
B树是非叶子节点和叶子节点都会存储数据,查找数据需要遍历所有的节点;
B+树只有叶子节点才会存储数据,而且存储的数据都是在一行上,默认排列好顺序(自左向右、从大到小),数据都有指针指向,也就是有顺序。所以B+TREE检索速度快; - 非聚集索引(MyISAM) :索引与数据不在同一个文件中,在索引文件中找到地址,根据地址在数据文件中找到数据.
(主键索引/非主键索引)下存储的都是数据的文件的地址值 - 主键索引
- 非主键索
- 聚集索引(InnoDB) :索引与数据在同一个文件中,即在同一棵树上。
主键索引 数据都存在叶子结点上 - 非主键索 叶子结点存的是主键
回表问题
select * from t where name=‘Alice’ ,此语句查询的执行过程是:
① 没建立索引
遍历整张表来查找结果,即全表扫描;
② 给name做了索引:
1.非主键索引树:A开头在左边查找,会很快查找到’Alice’下的主键18,
2.主键索引树:查找主键为’18’下的所有内容(因为是select * ,所以要查找所有的数据)
解决回表问题
- 只查索引和主键字段
select id,name from t where name=‘Alice’ 此语句不会产生回表,在一个树上完成查询,提升查询效率。(非主键索引树存着主键) - 需要查询到个别字段进行索引覆盖 (建立组合索引)
在一棵树上完成查询工作,在回表中举例的查询语句只能实现id,name查询不回表;利用组合索引,完成索引覆盖;将name和score做为组合索引: