上一篇我们说到了mysql数据库的存储引擎。Innodb和MyISAM都是使用的B+树索引。
这里我们就大概聊一下索引的一些基本属性。
- 索引的优缺点
- 索引的优点
1.索引可以大大提高检索效率,这也是创建索引最主要的目的。
- 索引的缺点
1.时间方面:创建索引和维护索引要消耗时间,对表中的数据进行增、删、改的时候索引也需要动态维护,
会降低增、删、改的执行效率。
2.空间方面:索引也需要占用物理空间。
MySQL的索引类型
- 从存储结构划分
1.BTree索引(B+或者B-),
2.Hash索引
3.full-index全文索引
4.R-Tree索引
- 从应用层次来分
1.普通索引:就是一个索引只包含单个列,一个表可以有多个单列索引。
2.唯一索引:就是索引的值必须是唯一的,但是允许有null值(有人说主键其实就是特殊的唯一索引,
也可以这么理解,但是主键不允许null值)。
3.复合索引:就是多个列值组成的索引,其效率大于做引合并。
聚簇索引:并不是单独的索引类型,而是一种数据存储方式。具体细节取决于不同实现,
InnoDB的聚簇索引其实就是在同一个结构中保存了B+树索引和数据行。比如主键索引其实就是聚簇索引。
非聚簇索引:不是非聚簇索引其实就是聚簇索引。
普通索引和唯一索引比较
在普通索引和唯一索引的选择上,在查询过程中,唯一索引比普通索引更快一点,这种效率基本上可以忽略不计。但是在数据的插入/修改的时候,如果字段是唯一索引,那个就要去检查它的唯一性,这时候涉及大量的随机IO操作,效率就会更低。所以在选择索引的时候,要根据业务需求,再次基础上选择索引。复合索引和普通索引比较
对于复合索引,和单个普通索引的比较。对于单个列的查询,普通索引的效率肯定是比复合索引要高的,对于多个列查询的(多个单列索引)和复合索引的效率比较,复合索引效率更高一些。另外在使用的时候要注意,复合索引遵从最左侧原则(这个貌似和sql的执行顺序有关系,我只是猜测)。
如果感觉我写的不够详细,大家可以去这里看看:
https://mp.weixin.qq.com/s/-_Z5p6bs7_EzxOKLPQqYBg
使用索引是为了提高检索效率,如果索引失效是不是就尴尬了?
- 关于导致索引失效的场景分别由以下几种情况:
1.对于复合索引,不满足最左侧匹配原则
2.使用了select *
3.索引列上有计算
4.索引列上使用了函数
5.字段类型不同(隐式转换)
6.like左侧包含%
7.列对比
8.使用or关键字(or两边都建立了索引其实是没生效的,但是如果有任意一边没有索引,那就悲剧了...)
9.not in或者not exists
10.order by的坑
建议大家去这里看看,写的针不戳!
https://mp.weixin.qq.com/s/ROLgSSeiHF_kutqS-v3I4w
另外建议大家,写完sql之后,记得执行一下explain,可以避免很多坑哦!