mysql索引
索引是什么
索引帮助mysql高效获取数据的数据结构,存储到磁盘,索引的文件存储形式与存储引擎相关。存储引擎:不同的表数据文件,在磁盘里以不同的组织形式存在,常见存储引擎有Innodb、MyISAM、memory 区别为:
- Innodb数据跟索引放在一个文件中,而MyISAM分为不同的的文件
- Innodb支持事务,MyISAM不支持
- Innodb支持表锁和行锁,MyISAM只支持表锁
- Innodb有外键,MyISAM没有
索引文件结构
- Hash
只有memory存储引擎支持hash索引,缺点很明显。第一个就是加载索引的时候需要将整个hash加载到内存,比较耗费空间。第二个就是hash索引不支持范围查找和排序的功能,但是找等值的速度非常快。 - 二叉树
无论是二叉树还是红黑树,树的深度会影响io次数,影响数据读取效率 - B树
非叶子节点存储数据,占据了大量的空间。 - B+树
只有叶子节点可以存储数据,深度大大降低。虽然Innodb和MyISAM都是支持B+树存储,但是有区别- Innodb的叶子节点存储的是整行数据,数据文件和索引文件是放在一起的,聚簇索引。
- MyISAM的叶子节点存储的是地址,从该地址读取真正的数据
索引的分类
- 普通索引
最基本的索引类型,值可以为空,没有任何限制 - 唯一索引
索引列的值必须唯一,允许有空值 - 主键索引
是一种特殊的唯一索引,不允许有空值, - 全文索引
仅用于MyISAM,用于在一篇文章中,检索文本信息的,针对较大的数据。 - 组合索引
多列值组成一个索引,专门用于组合搜索
回表
如果建的是普通索引,B+树的叶子节点存储的不是整行数据,而是当前数据的主键,根据主键值,在主键的B+树查找数据,遍历两次。如果没有设置主键就找唯一健,如果唯一健也没有会找row_id。
索引覆盖
select id from table where name=jay
如果你用name建了个普通索引,id又刚好是主键,那么这条语句就不用回表。
最左匹配原则
为了更高效的建立,使用组合索引。假如用age,gender创建组合索引,那么从左向右依次进行查找,先匹配age,再匹配gender
select * from table where age = 18 and gender = m
select * from table where age = 18 and gender = m
select * from table where gender = m
select * from table where age = 18
第三条不可以,因为先匹配的gender。第二条mysql会做优化,可以。