MySQL InnoDB 存储引擎索引那些事儿
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 存储引擎索引那些事儿相关推荐
- 数据结构与索引-- mysql InnoDB存储引擎索引
索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...
- mysql InnoDb存储引擎索引
B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...
- MySQL Innodb存储引擎使用B+树做索引的优点
对于数据库来说,索引和表数据都是存放在磁盘上的,一般使用B+树作为索引 MySQL Innodb存储引擎使用了B+树作为索引的优点,主要有以下原因: 1.索引和表数据都是存放在磁盘上的,如果磁盘上的数 ...
- 为什么MySQL InnoDB 存储引擎要用B+树做索引,而不用B树?
为什么MySQL InnoDB 存储引擎 要用B+树做索引,而不用B树? (1)B+树空间利用率更高,可减少I/O次数 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存 ...
- MySQL InnoDB存储引擎
呵呵哒... MySQL体系结构和存储引擎 首先要搞懂的是什么是数据库,什么是数据库实例. 数据库:物理操作系统文件或其他形式文件类型的集合. 实例:MySQL数据库由后台线程以及一个共享内存区组成, ...
- mysql InnoDB存储引擎的介绍
mysql InnoDB存储引擎的介绍 概念 1.InnoDB是MySQL默认的存储引擎,如果需要其不支持的特性,则考虑使用其他存储发动机. 2.InnoDB采用MVCC支持高并发,实现四个标准隔离级 ...
- 浅析Mysql InnoDB存储引擎事务原理
浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021
- MySQL InnoDB存储引擎 聚集和非聚集索引
B+树索引 索引的目的在于提高查询效率,可以类比字典,如果要查"mysql"这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能 ...
- 谈谈MySQL InnoDB存储引擎事务的ACID特性
2019独角兽企业重金招聘Python工程师标准>>> 1.前言 狼哥一直对数据库Mysql这块没有进行过系统的深入学习,今天看到一篇文章写的还不错,特意分享一下,我不能保证文章中所 ...
最新文章
- 游戏设计行业标准测试:秘密收集
- R语言ggplot2可视化在可视化图像中添加上限线条、下限线条、添加上下限图例实战
- 编译hadoop2.2.0源码时报错
- 【干货】SqlServer 总结几种存储过程分页的使用
- 安徽大学计算机考研失败,回馈:2014年安徽大学计算机初试回忆题,我是雷锋,低调...
- c 语言名称的作用域,C 作用域规则
- EXT.NET 更改lable和Text的颜色
- ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习
- ssh 免密_Linux下配置SSH免密通信 “sshkeygen”的基本用法
- spring.mvc.static-path-pattern、spring.resources.static-locations
- wordspress-作品展示主题Muiteer2.3.7开心版主题模板
- UITextView 控件-IOS开发
- MFC浅析 8 CArchive 原理
- San 3.7.3 发布,百度开源的 MVVM 组件框架
- C++中名字隐藏,名字查找优先于类型检查
- 已知空间三点求圆心坐标,在matlab中的实现方法
- 笔记本电脑华硕N56VZ的几种螺丝规格
- 转载:技术文化和惨淡命运 —— 怀念中国雅虎
- python 有道翻译,python 实现有道翻译功能
- 数字藏品文博周将至,拙政园主题数字藏品全网首发