定义:索引是一种用于快速查询和检索数据的数据结构
优点:
1.加快数据检索速度
2.通过创建唯一性索引,保证数据库表中每一行数据的唯一性
缺点:
1.创建和维护索引也会耗费时间
2.索引需要占用磁盘空间
3.对数据进行增删改查的时候,索引也要动态的维护
适合加索引:
1.where中经常使用的字段
2.不经常更新的字段
3.数据量大的表
4.数据离散度大(性别,真假等不适合)
5.不参与计算的列(防止索引失效)
不走索引的情况:
1.like xxx
2.索引列参与了运算
3.索引列使用了函数
4.使用了or
5.复合索引a-b-c a可以,b不可以,c不可以;ab可以 ba可以 ac可以 ca可以 bc不可以 cb不可以;abc可以
6.不等于
7.is null或is not null
索引的实现原理
1.MyISAM
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据的地址,并不直接存放数据值;
辅助索引和主索引结构上没有区别但是辅助索引的key可以重复
2.InnoDB
InnoDB也使用B+Tree作为索引结构,但是与MyISAM有一些区别:
- InnoDB的数据文件就是索引文件,MyISAM的数据和索引是分开的,InnoDB的B+Tree的叶子结点记录了表的完整数据。这种索引叫聚集索引,InnoDB的数据文件按照主键聚集,所以必须要有主键(MyISAM可以没有),如果没有显式地指定主键,系统会自动选择一个列作为主键(UNIQUE NOT NULL),如果也没有则会生成一个隐含字段作为主键,长度6字节,类型长整型。
- InnoDB的辅助索引记录的是主键的值而不是地址,所以辅助索引搜索需要检索两遍索引,先检索辅助索引,得到主键,再检索主键索引。
- 为什么用B+Tree作为索引结构
B+Tree的非叶子节点不存数据,意味着他能够存储更多的引用指向更多的叶子,所以B+Tree的高度往往更低 一般2~4层,意味着查找到一个数据只需要进行2~4次IO即可,减少IO消耗的时间。