InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表。每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创建一个6字节大小指针。

1、索引类型

MySQL InnoDB 存储引擎支持 B+ 树索引,哈希索引, 和全文索引。

1)B+ 树

Balance 平衡查找树,所有记录节点都是按键值大小顺序存储在同一层的叶子节点上,各叶子节点通过指针进行链接。

插入删除数据时,B+ 树总会保持平衡。B+ 树的高度一般在2-4层,也就是查找某一键值的行记录时,只需要2-4次的IO,查询时间短。

B+ 树索引分为聚集索引和辅助索引,聚集索引就是索引和数据存储在一起的索引类型,B+ 树聚集索引就是在叶子节点上存储整行数据。

辅助索引的叶子节点存储键值,和对应的行记录的聚集索引键。

2)哈希索引

哈希算法在查找数据时,只需要一次磁盘 IO,查找速度非常快,用于精确定位。因为不支持范围查找,实际使用比较少。

InnoDB引擎使用除法散列方式的哈希函数,冲突机制使用的是链表方式,并且支持自适应哈希索引,默认开启,可以通过 innodb_adaptive_hash_index 来禁止此特性。

3)全文索引

根据最左匹配的原则,B+ 树不适合 like '%word%'这样的查询,于是引出了全文检索,即将存储在数据库中的任意内容查找出来的技术。

在InnoDB引擎中,对一个表只能建立一个全文索引,并且不支持没有单词界定符的语言,如中、日、韩语等。

所以一般搜索引擎,都是使用另外的技术来实现全文检索,比如ElasticSearch。

2、联合索引

一般查询条件中都会使用到两个或更多个字段,针对此情况,可以创建联合索引,即在多个字段上建立索引。

联合索引建立原则,最左匹配和区分度最高的字段往前放。

3、覆盖索引

覆盖索引指的是从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录;因为辅助索引存储表记录的部分字段,比聚集索引小,所以IO操作少。

1) 对于统计操作,例如 count(*),有时候根据查询条件判断不会使用覆盖索引,但是优化器还是会选择辅助索引。

例如,表table有联合索引,使用a、b两个字段,查询语句为:

select count(*) from table where b > '2020-01-01'

2) 对于不能进行索引覆盖的查询,但是查找的数据是少量(20%)的情况下,MySQL 查询优化器还是会选择辅助索引。

例如,表table有多个字段,只在a、b两个字段上建立联合索引,查询语句为:

select * from table where a< '2020-01-01'

当查询数据比例少于20%的时候,会使用覆盖索引,即使用联合索引。

4、索引下推

索引下推,Index Condition Pushdown, 是  MySQL 5.6 版本开始支持的查询优化方式,指的是在索引取出时,就会进行 where 查询条件过滤,然后才去获取数据记录。

支持 range,ref,eq_ref, ref_or_null 类型查询,支持MyISAM和InnoDB存储引擎。当优化器进行索引下推时,SQL的执行计划结果 extra列会显示 Using index condition。

MySQL InnoDB 存储引擎索引那些事儿相关推荐

  1. 数据结构与索引-- mysql InnoDB存储引擎索引

    索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...

  2. mysql InnoDb存储引擎索引

    B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...

  3. MySQL Innodb存储引擎使用B+树做索引的优点

    对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...

  4. 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?

    为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...

  5. MySQL InnoDB存储引擎

    呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...

  6. mysql InnoDB存储引擎的介绍

    mysql InnoDB存储引擎的介绍 概念 1.InnoDB是MySQL默认的存储引擎,如果需要其不支持的特性,则考虑使用其他存储发动机. 2.InnoDB采用MVCC支持高并发,实现四个标准隔离级 ...

  7. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  8. MySQL InnoDB存储引擎 聚集和非聚集索引

    B+树索引 索引的目的在于提高查询效率,可以类比字典,如果要查"mysql"这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能 ...

  9. 谈谈MySQL InnoDB存储引擎事务的ACID特性

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 狼哥一直对数据库Mysql这块没有进行过系统的深入学习,今天看到一篇文章写的还不错,特意分享一下,我不能保证文章中所 ...

最新文章

  1. 游戏设计行业标准测试:秘密收集
  2. R语言ggplot2可视化在可视化图像中添加上限线条、下限线条、添加上下限图例实战
  3. 编译hadoop2.2.0源码时报错
  4. 【干货】SqlServer 总结几种存储过程分页的使用
  5. 安徽大学计算机考研失败,回馈:2014年安徽大学计算机初试回忆题,我是雷锋,低调...
  6. c 语言名称的作用域,C 作用域规则
  7. EXT.NET 更改lable和Text的颜色
  8. ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习
  9. ssh 免密_Linux下配置SSH免密通信 “sshkeygen”的基本用法
  10. spring.mvc.static-path-pattern、spring.resources.static-locations
  11. wordspress-作品展示主题Muiteer2.3.7开心版主题模板
  12. UITextView 控件-IOS开发
  13. MFC浅析 8 CArchive 原理
  14. San 3.7.3 发布,百度开源的 MVVM 组件框架
  15. C++中名字隐藏,名字查找优先于类型检查
  16. 已知空间三点求圆心坐标,在matlab中的实现方法
  17. 笔记本电脑华硕N56VZ的几种螺丝规格
  18. 转载:技术文化和惨淡命运 —— 怀念中国雅虎
  19. python 有道翻译,python 实现有道翻译功能
  20. 数字藏品文博周将至,拙政园主题数字藏品全网首发

热门文章

  1. MFC中常见控件的操作
  2. java swing 图片旋转_Java图片旋转,背景透明化
  3. 洛谷P3613 睡觉困难综合征
  4. 项目微管理17 - 双赢
  5. Java网络编程----基础
  6. Android RecyclerView、ListView实现单选列表的优雅之路.
  7. 扩展jquery scroll事件,支持 scroll start 和 scroll stop
  8. Elastic-job 2.1.3 概述
  9. 策略模式Strategy——坐什么车回家?
  10. 数据库中的DbUtils