文章目录

什么是索引

索引的分类

索引的本质

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索引本质相关推荐

  1. mysql 查询相同字段值的个数_好文 | MySQL 索引B+树原理,以及建索引的几大原则...

    MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下. 一.存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的. ...

  2. mysql 获取距离当前最新的记录_一文带你了解 MySQL 中的各种锁机制!

    云栖号资讯:[点击查看更多行业资讯] 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! MySQL中的锁机制,按粒度分为行级锁,页级锁,表级锁,其中按用法还分为共享锁和排他锁. 行级锁 ...

  3. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  4. mysql查询10分钟内的数据库_十分钟了结MySQL information_schema

    information_schema数据库是MySQL系统自带的数据库,它提供了数据库元数据的访问方式.感觉information_schema就像是MySQL实例的一个百科全书,记录了数据库当中大部 ...

  5. 开源日志审计系统_一文掌握mysql数据库审计特点、实现方案及审计插件部署教程...

    概述 数据库审计(简称DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断.它通过对用户访问数据库行为的记录.分 ...

  6. mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例

    <转>mysql存储过程语法及实例 存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法------- ...

  7. mysql insert表名前不写字段_云计算教程分享Mysql技术知识点

    云计算教程分享Mysql技术知识点,首先来讲一下Mysql语句精进 安装数据库,然后导入tigerfive.sql. sql见文档结尾部分 MySQL示例数据库模式由以下表组成: - customer ...

  8. c索引超出了数组界限_关于MATLAB逻辑数组索引的二三事(二)

    刀剑神域 UW 终章演的什么玩意,都给我看乐了,还不如回去再看一遍加速世界. MATLAB 逻辑数组索引还是非常好用的,MATLAB 中,索引数组常用的有两种方法,一种是线性索引(linear ind ...

  9. MySQL提权的两种方式_利用sqlmap进行mysql提权的小方法(win与liunx通用)

    文章作者:pt007@vip.sina.com 文章来源:https://www.t00ls.net/thread-36196-1-1.html 1.连接mysql数据打开一个交互shell: sql ...

最新文章

  1. linux 下 ifcfg-eth0 配置
  2. 李飞飞团队最新论文:基于anchor关键点的类别级物体6D位姿跟踪
  3. C++11 constexpr使用
  4. 了解活动目录操作主机角色及GUI命令行查看方法
  5. 人民日报“权威认证”吃鸡装备哪家强,不服来辩!
  6. 动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
  7. win7安装composer
  8. 90后过年,吃零下18度的年夜饭
  9. 隐马尔可夫模型(五)——隐马尔可夫模型的解码问题(维特比算法)
  10. html图片右上角关闭按钮,jQuery UI:datepicker – 如何在右上角添加关闭按钮(图像!)?...
  11. FastFel解析一个公式的步骤
  12. php中is_uploaded_file()函数的用法
  13. Java程序员进阶书籍 ,看这11本书就够了
  14. 如何在华为路由器中虚拟服务器,华为路由器ip地址
  15. 【GAMES101现代计算机图形学入门笔记】Lec05 光栅化1(三角形)
  16. 优秀的测试工程师应该具备哪些素质
  17. doom3关卡编辑器代码的一些分析
  18. springboot 第十九节 starter and muti_datasource 多数据源
  19. 2022山东健博会,食疗养生与滋补健康展,健康管理与精准医学展
  20. PS制作两寸照片的疑惑

热门文章

  1. Android7.1修改系统默认多媒体音量大小
  2. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法
  3. 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
  4. 深入理解信号槽(二)
  5. ★宣传广告变成社会标准
  6. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
  7. CentOS 7核心安装及基本配置
  8. Oracle 11gR2学习之三(创建用户及表空间、修改字符集和Oracle开机启动)
  9. objloader使用方法
  10. win7(x64)安装oracle 10g 32位的方法