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会做优化,可以。

posted on 2020-05-01 22:51  我想做个好人  阅读(187)  评论(0编辑  收藏  举报