mysql的索引本质是一颗_一文揭开Mysql索引本质
文章目录
什么是索引
索引的分类
索引的本质
HASH
B+树
Mysql存储引擎
InnoDB
MyISAM
试验
结语
什么是索引
众所周知,索引是用来加快数据库查询速度的,试想一条sql语句:select * from my_table where id = 10000,如果没有索引,那么就必须要遍历整张表,直到找到id=10000这一行数据,这样做无疑是低效的。而如果在id这一列上建立了索引,就可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可以极大的提高查询速度。
索引的分类
普通索引:仅用来加速查询。
唯一索引:加速查询+列值唯一(允许为null)。
主键索引:加速查询+列值唯一(不允许为null),一张表只能由一个主键索引。
联合索引:多个列值组成一个索引,用于组合搜索,其效率大于索引合并。
全文索引:对文本的内容进行分词,解决判断字段是否包含的问题。(实际中使用较少)
索引的本质
mysql默认的索引方式是B+树,用户也可以选择HASH,下面依次介绍这两种方式
HASH
哈希函数会根据传入的关键字计算出其所在的位置,它会将关键字域映射到哈希表中的一个位置上。,我们在查询的时候,只需要进行一次运算后就可以找到该行数据对应的下标位置,时间复杂度为O(1),但是它有几个很明显的缺点:
浪费数据空间,HASH表中很多地方是没有存数据的。
不支持范围查询。
不支持排序。
基于以上几个缺点,虽然HASH进行查询时速度很快,但是Mysql不将它作为
默认索引方式。
B+树
m阶B+树的性质:
每个节点最多有m个子节点。
除根节点外,每个节点至少有m/2个子节点,注意如果结果除不尽,就向上取整,比如5/2=3。
根节点要么是空,要么是独根,否则至少有2个子节点。
有k个子节点的节点必有k个关键码。
叶节点的高度一致。
数据只存在于叶节点中。
下图给出了一个3阶的B+树的结构
叶子节点顺序排列,数据全部存放在叶子节点中(也称为卫星数据),其余节点仅存放索引,同时叶子节点通过组成一个双向链表。
从图中可以看出,每一个子节点中的最大值都能在其父节点中找到,看着是不是有点像二叉搜索树呢?与之不同的是,B+树每一个节点都能存放多个数据。
这里举一个例子,假设我们想找大于5,小于16的数据,B+树从根节点像下找的过程如下:
B+树的查询效率很高,而且很适合范围查询。
有点朋友可能会问了,我们应该如何选择B+树的阶数呢?
大家都知道,数据库查询的瓶颈在于磁盘IO,而数据是存在我们的磁盘上的,我们应该尽可能减少磁盘IO次数,那么应尽量把数据存在一个磁盘块中,由于磁盘块的大小一般是4KB,所以M阶B+树的M值应尽可能向它靠拢,我们一般取4KB的0.75倍。同时,由于除叶子节点外其余节点没有存卫星数据,所以这些节点能存放更多的索引。这也减小了磁盘的IO。
Mysql存储引擎
InnoDB
InnoDB是mysql默认的存储引擎,它采用聚集索引,支持事务。
这儿提到了聚集索引,那么什么是聚集索引呢?
聚集索引就是将数据文件和索引放在一起,也就是说当我们通过索引进行查询的时候,能够直接找到数据。
这里以主键ID对应的索引为例
可以看到索引和数据文件是放在一起的。(这里的data指的是对应行包含所有列值的整行数据,不单单只是一个数据)
而当使用辅助索引(非主键字段建立的索引)进行查询时,索引值是和该行对应的主键值放在一起的,这就意味这查询时先找到该行主键ID,然后再通过这个主键ID值在主键的索引树下找到数据。
MyISAM
mysql也提供MyISAM存储引擎,MyISAM采用非聚集索引,查询效率高,但不支持事务。
什么是非聚集索引呢?
非聚集索引就是索引和数据是分开放的。
那么怎么通过索引找到数据呢?
请看下面的索引树
虽然数据和索引是分开的,但每一个索引下面存的是该行数据对应的地址,也就是说我们可以拿到该行数据的地址,那么直接寻址就可以找到数据。
试验
下面我们来通过一个试验直观的感受两个存储引擎的不同。
首先先创建一个数据库
create database test_db;
然后看到我的mysql安装目录的data文件夹下多了一个test_db文件夹,进入文件夹,现在文件夹是空的。
选择刚刚创建的数据库。
use test_db;
然后创建一张使用InnoDB存储引擎的表,由于mysql默认使用InnoDB,所以可以不指定引擎。
create table user1(id int primary key auto_increment,name varchar(20));
然后再看test_db文件夹。
可以看到多了一个user1.ibd文件,这个表的索引和数据是放在一个文件中的。
我们再创建一张使用MyISAM存储引擎的表,这里需要显示指定引擎。
create table user2(id int primary key auto_increment,name varchar(20))engine=myisam charset=utf8;
然后再看test_db文件夹。
可以看到多了user2.MYD和user2.MYI
其中user2.MYD存放的的是表的数据文件,而user2.MYI存放的是表的索引文件。
结语
索引能大大的提高我们的工作效率,但索引是有开销的,当我们的数据量很小时也没有建索引的必要,希望这篇文章能让大家认识到索引的本质。
mysql的索引本质是一颗_一文揭开Mysql索引本质相关推荐
- mysql 查询相同字段值的个数_好文 | MySQL 索引B+树原理,以及建索引的几大原则...
MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下. 一.存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的. ...
- mysql 获取距离当前最新的记录_一文带你了解 MySQL 中的各种锁机制!
云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...
- mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计
很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...
- mysql查询10分钟内的数据库_十分钟了结MySQL information_schema
information_schema数据库是MySQL系统自带的数据库,它提供了数据库元数据的访问方式.感觉information_schema就像是MySQL实例的一个百科全书,记录了数据库当中大部 ...
- 开源日志审计系统_一文掌握mysql数据库审计特点、实现方案及审计插件部署教程...
概述 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断.它通过对用户访问数据库行为的记录.分 ...
- mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例
<转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...
- mysql insert表名前不写字段_云计算教程分享Mysql技术知识点
云计算教程分享Mysql技术知识点,首先来讲一下Mysql语句精进 安装数据库,然后导入tigerfive.sql. sql见文档结尾部分 MySQL示例数据库模式由以下表组成: - customer ...
- c索引超出了数组界限_关于MATLAB逻辑数组索引的二三事(二)
刀剑神域 UW 终章演的什么玩意,都给我看乐了,还不如回去再看一遍加速世界. MATLAB 逻辑数组索引还是非常好用的,MATLAB 中,索引数组常用的有两种方法,一种是线性索引(linear ind ...
- MySQL提权的两种方式_利用sqlmap进行mysql提权的小方法(win与liunx通用)
文章作者:pt007@vip.sina.com 文章来源:https://www.t00ls.net/thread-36196-1-1.html 1.连接mysql数据打开一个交互shell: sql ...
最新文章
- linux 下 ifcfg-eth0 配置
- 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪
- C++11 constexpr使用
- 了解活动目录操作主机角色及GUI命令行查看方法
- 人民日报“权威认证”吃鸡装备哪家强,不服来辩!
- 动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
- win7安装composer
- 90后过年,吃零下18度的年夜饭
- 隐马尔可夫模型(五)——隐马尔可夫模型的解码问题(维特比算法)
- html图片右上角关闭按钮,jQuery UI:datepicker – 如何在右上角添加关闭按钮(图像!)?...
- FastFel解析一个公式的步骤
- php中is_uploaded_file()函数的用法
- Java程序员进阶书籍 ,看这11本书就够了
- 如何在华为路由器中虚拟服务器,华为路由器ip地址
- 【GAMES101现代计算机图形学入门笔记】Lec05 光栅化1(三角形)
- 优秀的测试工程师应该具备哪些素质
- doom3关卡编辑器代码的一些分析
- springboot 第十九节 starter and muti_datasource 多数据源
- 2022山东健博会,食疗养生与滋补健康展,健康管理与精准医学展
- PS制作两寸照片的疑惑
热门文章
- Android7.1修改系统默认多媒体音量大小
- 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法
- 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
- 深入理解信号槽(二)
- ★宣传广告变成社会标准
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
- CentOS 7核心安装及基本配置
- Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
- objloader使用方法
- win7(x64)安装oracle 10g 32位的方法