【mysql】InnoDB引擎的索引

       

目录

1、B+树索引

1.1 二叉树

1.1.1 二分查找(对半查找)

1.1.2 树(Tree)

1.1.2.1 树的定义

1.1.2.2 树的特点

1.1.2.3 二叉树

1.1.2.4 二叉查找(搜索)树

1.2 B+树

1.2.1 聚簇索引(clustered index)

        主键索引(primary key)

1.2.2 辅助索引(secondary key)

        唯一索引(unique index)

        普通索引(normal index)

        组合索引(composite index)

        前缀索引(prefix index)

1.2.3 索引覆盖及回表

        索引覆盖

        回表

1.2.4 最左前缀匹配原则

2、哈希索引

        2.1 hash索引的优缺点

        优点:

        缺点:

        2.2 innoDB的自适应hash

3、倒排索引(Inverted index)

        全文索引(Full text)

4、索引的优缺点

        优点: 

        缺点:


 

        InnoDB存储引擎支持以下几种常见的索引:B+树索引、全文索引、哈希索引,其中比较关键的是B+树索引

1、B+树索引

        InnoDB中的索引自然也是按照B+树来组织的,前面我们说过B+树的叶子节点用来放数据的,但是放什么数据呢?索引自然是要放的,因为B+树的作用本来就是就是为了快速检索数据而提出的一种数据结构,不放索引放什么呢?但是数据库中的表,数据才是我们真正需要的数据,索引只是辅助数据,甚至于一个表可以没有自定义索引。InnoDB中的数据到底是如何组织的?

1.1 二叉树

1.1.1 二分查找(对半查找)

        二分查找法(binary search) 也称为折半查找法,用来查找一组有序的记录数组中的某一记录。

例:在以下数组中找到数字48对应的下标

通过3次二分查找 就找到了我们所要的数字,而顺序查找需8次。

对于上面10个数来说,顺序查找平均查找次数为(1+2+3+4+5+6+7+8+9+10)/10=5.5次。而二分查找法为(4+3+2+4+3+1+4+3+2+3)/10=2.9次。在最坏的情况下,顺序查找的次数为10,而二分查找的次数为4。

所以为了索引查找的高效性,我们引入了二叉查找树。

1.1.2 树(Tree)

1.1.2.1 树的定义

N个结点构成的有限集合。

  • 树中有一个称为”根(Root)”的特殊结点

  • 其余结点可分为M个互不相交的树,称为原来结点的”子树”

1.1.2.2 树的特点

非树结构:

  • 子树是不相交的
  • 除了根结点外,每个节点有且只有一个父节点
  • 一个N个结点的树只有N-1条边
1.1.2.3 二叉树

        度为2的树(也可称之为阶):(树的度:树中所有结点中最大的度。结点的度:结点的子树个数)

子树有左右顺序之分:

1.1.2.4 二叉查找(搜索)树

   二叉查找树首先肯定是个二叉树,除此之外还符合以下几点:

  • 左子树的所有的值小于根节点的值

  • 右子树的所有的值大于或等于根节点的值

  • 左、右子树满足以上两点

1.2 B+树

        B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。

1.2.1 聚簇索引(clustered index)

        聚簇索引就是一种B+树结构,其叶子节点中存放着每一行完整的数据

        非聚簇索引中,叶子节点存放的是主键值

        主键索引(primary key)

                就是一聚簇索引,主键索引的定义方式

  • 主键存在:以主键作为聚簇索引
  • 主键不存在,存在非空唯一索引:以非空的唯一索引作为聚簇索引
  • 两者都不存在:选择 隐式字段 DB_ROW_ID 定义为主键作为聚簇索引
添加主键索引:
alter table 表名 add primary key(列名);
alter table user add primary key(`id`);

1.2.2 辅助索引(secondary key)

        非聚簇索引都是辅助索引又称二级索引,非聚簇索引其叶子节点的 data 中存的不是完整的数据,而是主键值,如果没有 索引覆盖 则通过 回表 查询聚簇索引找到数据。

        唯一索引(unique index)

                索引列的值必须是唯一的,允许空值。唯一索引不允许表中任何两行的值具有相同的索引值。

添加唯一索引:
alter table 表名 add unique index 索引名(列名);
alter table user add unique index index_id_card(`id_card`);
        普通索引(normal index)

                基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。

添加普通索引:
alter table 表名 add index 索引名(列名);
alter table user add index index_name(`name`);
        组合索引(composite index)

                组合索引又称为复合索引,使用时需要遵循 最左前缀匹配原则 。如果条件允许的情况下使用组合索引替代多个单列索引使用,所以创建多列索引时,要根据业务场景,将where子句中使用最频繁的一列放在最左边。

添加组合索引:
alter table 表名 add index 索引名(列名1,列名2.......);
alter table user add index index_age_name(`age`,`name`);
        前缀索引(prefix index)

                在文本类型如 charvarchartext 类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

添加前缀索引:
alter table 表名 add index 索引名(列名(长度));
alter table user add index index_address(address(2));

1.2.3 索引覆盖及回表

        索引覆盖

                创建的索引,包含了查询中的所有字段,只需要通过索引就可以查找和返回查询所需要的数据。索引覆盖的优势是能够一次性完成查询工作,减少IO,提高了查询效率

        回表

                回表的原因是,我们在查询中,通过辅助索引获取到数据的主键Id,然后在通过主键ID去查询聚簇索引找到一行的完整数据。要求是查询所需数据有非索引列

1.2.4 最左前缀匹配原则

        针对组合索引,索引以最左边的创建的顺序,进行索引匹配。在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边,这样能够提高查询效率

2、哈希索引

        哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

        哈希表 是 数组 + 链表 的形式,通过哈希函数计算每个节点数据中键所对应的哈希桶位置,如果出现哈希冲突,就使用拉链法来解决。

        2.1 hash索引的优缺点

        优点:

        Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

        使用的场景: 一些读操作密集的表建议使用hash索引,因为hash索引的查找速度是很快的。但是也有一些局限。

        缺点:

1、hash索引只包含哈希码和行指针,不能使用索引的值避免读取行,也就是要回表,不能像覆盖索引那样避免回表。
2、hash索引不能进行排序以及范围查找,只支持 = 、in 、<=>的比较,因为它们不会按照顺序保存行数据。
3、有可能产生hash碰撞,那么就必须要访问链表的每一个行指针,然后逐行进行比较得出正确数据。
4、因为hash算法是基于等值计算的,不支持部分键匹配,例如有个组合索引a_b,那么此时即使我们的where子句中使用到了a,也不会使用索引,like 等范围查找同理。

        2.2 innoDB的自适应hash

        当Innodb注意到一些索引值被频繁的访问时,内部会在b-tree索引的顶端为其创建索引保存在内存之中,使其具有快速哈希查找的特性,这个过程是它自动完成的。

可以通过参数 innodb_adaptive_hash_index 来决定是否开启。默认是打开的。

mysql> show variables like "innodb_adaptive_hash_index";
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.16 sec)

自适应哈希索引是对innodb的缓冲池的B+树页进行创建,不是对整张表创建,因此速度很快。

可以通过查看innodb的 status 命令来查看自适应哈希索引的使用情况。

mysql> show engine innodb status;
+--------+------+---------+
| Type   | Name | Status                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
+--------+------+---------+
| InnoDB |      |      
=====================================
2022-12-13 15:06:03 0x62f0 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 6 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 191 srv_active, 0 srv_shutdown, 708026 srv_idle
srv_master_thread log flush and writes: 708217
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 4025
OS WAIT ARRAY INFO: signal count 4057
RW-shared spins 0, rounds 40132, OS waits 3309
RW-excl spins 0, rounds 4589, OS waits 141
RW-sx spins 54, rounds 1573, OS waits 50
Spin rounds per wait: 40132.00 RW-shared, 4589.00 RW-excl, 29.13 RW-sx
------------
TRANSACTIONS
------------
Trx id counter 3233592
Purge done for trx's n:o < 3233410 undo n:o < 0 state: running but idle
History list length 90
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 283413858068272, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
--------
FILE I/O
--------
I/O thread 0 state: wait Windows aio (insert buffer thread)
I/O thread 1 state: wait Windows aio (log thread)
I/O thread 2 state: wait Windows aio (read thread)
I/O thread 3 state: wait Windows aio (read thread)
I/O thread 4 state: wait Windows aio (read thread)
I/O thread 5 state: wait Windows aio (read thread)
I/O thread 6 state: wait Windows aio (write thread)
I/O thread 7 state: wait Windows aio (write thread)
I/O thread 8 state: wait Windows aio (write thread)
I/O thread 9 state: wait Windows aio (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
 ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
198289 OS file reads, 27374 OS file writes, 1469 OS fsyncs
0.00 reads/s, 0 avg bytes/read, 0.00 writes/s, 0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 552, seg size 554, 552 merges
merged operations:
 insert 13450, delete mark 1, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 17393, node heap has 1 buffer(s)
Hash table size 17393, node heap has 18 buffer(s)
Hash table size 17393, node heap has 1 buffer(s)
Hash table size 17393, node heap has 189 buffer(s)
Hash table size 17393, node heap has 2 buffer(s)
Hash table size 17393, node heap has 1 buffer(s)
Hash table size 17393, node heap has 0 buffer(s)
Hash table size 17393, node heap has 1 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 30110810223
Log flushed up to   30110810223
Pages flushed up to 30110810223
Last checkpoint at  30110810214
0 pending log flushes, 0 pending chkp writes
509 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 68648960
Dictionary memory allocated 685290
Buffer pool size   4096
Free buffers       1024
Database pages     2859
Old database pages 1035
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 53454, not young 2806497
0.00 youngs/s, 0.00 non-youngs/s
Pages read 197570, created 18349, written 25879
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 2859, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Process ID=1864, Main thread ID=1912, state: sleeping
Number of rows inserted 505838, updated 2, deleted 0, read 6824874
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
 |
+--------+------+---------+
1 row in set (0.17 sec)

mysql> 

3、倒排索引(Inverted index)

        全文索引(Full text)

        全文索引 通常使用 倒排索引 来实现。倒排索引(Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构,同B+树索引一样,也是一种索引结构。通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。

添加全文索引:
alter table 表名 add fulltext index 索引名(列名);
alter table user add fulltext index index_profile(`profile`);

4、索引的优缺点

        优点: 

  • 创建索引可以大幅提高系统性能,帮助用户提高查询的速度;
  • 可以加速表与表之间的链接;
  • 降低查询中分组和排序的时间。

        缺点:

  • 索引的存储需要占用磁盘空间;
  • 当数据的量非常巨大时,索引的创建和维护所耗费的时间也是相当大的;
  • 当每次执行create、update、delete操作时,索引也需要动态维护,降低了数据的维护速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/361314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI-数学-高中-14-函数零点存在定理和运用

原作者视频&#xff1a;【函数综合】【考点精华】1零点存在性定理的运用&#xff08;基础&#xff09;_哔哩哔哩_bilibili 1.定义&#xff1a; 2.零点存在定义&#xff1a; 2.函数零点与图像焦点的转化 零点如果不好求&#xff0c;将函数化成两个函数再画图&#xff0c;看函数…

防抖和节流?有什么区别?如何实现?

#一、是什么 本质上是优化高频率执行代码的一种手段 如&#xff1a;浏览器的 resize、scroll、keypress、mousemove 等事件在触发时&#xff0c;会不断地调用绑定在事件上的回调函数&#xff0c;极大地浪费资源&#xff0c;降低前端性能 为了优化体验&#xff0c;需要对这类…

计算机网络-物理层传输介质(导向传输介质-双绞线 同轴电缆 光纤和非导向性传输介质-无线波 微波 红外线 激光)

文章目录 传输介质及分类导向传输介质-双绞线导向传输介质-同轴电缆导向传输介质-光纤非导向性传输介质小结 传输介质及分类 物理层规定电气特性&#xff1a;规定电气信号对应的数据 导向传输介质-双绞线 双绞线的主要作用是传输数据和语音信息。它通过将两根导线以特定的方…

python爬虫2

1.table 是表格&#xff0c;tr是行&#xff0c;td是列 ul li是无序列标签用的较多&#xff0c;ol li是有序列标签 最基本的结构 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title> Title </title>…

【JavaEE】UDP协议与TCP协议

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

CSS复合选择器

目录 1.什么是复合选择器 2.后代选择器 3.子选择器 4.并集选择器 5.伪类选择器 5.1链接伪类选择器 5.2 :focus 伪类选择器 6.总结 7.补充 7.1相邻兄弟选择器&#xff08;也叫加号选择器&#xff09; 7.2通用兄弟选择器&#xff08;也叫波浪号选择器&#xff09; 1. 什…

力扣hot100 划分字母区间 贪心 思维 满注释版

Problem: 763. 划分字母区间 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 代码随想录 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {public List<Integer> partitionLabels(String s){// 创建哈希…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

闭包的理解?闭包使用场景

说说你对闭包的理解&#xff1f;闭包使用场景 #一、是什么 一个函数和对其周围状态&#xff08;lexical environment&#xff0c;词法环境&#xff09;的引用捆绑在一起&#xff08;或者说函数被引用包围&#xff09;&#xff0c;这样的组合就是闭包&#xff08;closure&#…

FFmpeg和Monibuka拉取rtsp(大华摄像头)视频流时未进行URLCode编码导致提示404等报错

场景 Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放&#xff1a; Monibucav4(开源流媒体服务器)在Windows上搭建rtmp服务器并实现拉取rtsp视频流以及转换flv播放_monibuca 搭建流媒体服务-CSDN博客 Nginx搭建RTMP服务器FFmpeg…

Origin 2022下载安装教程,操作简单,小白也能轻松搞定,附安装包,带软件使用教程

前言 Origin是一个科学绘图、数据分析软件&#xff0c;支持各种各样的2D/3D图形&#xff0c;包括统计&#xff0c;信号处理&#xff0c;曲线拟合以及峰值分析&#xff0c;Origin具有强大的数据导入功能和多样的图形输出格式。 准备工作 1、Win7及以上系统 2、提前准备好 Or…

十分钟快速上手Spring Boot与微信小程序API接口的调用,快速开发小程序后端服务

1.1 微信小程序API接口介绍 微信小程序API接口是连接小程序前端与后端服务器的桥梁&#xff0c;它提供了丰富的功能接口&#xff0c;包括用户信息、支付、模板消息、数据存储等。这些API接口能够满足开发者在小程序中实现各种复杂业务逻辑的需求。 用户信息接口 用户信息接口…

Windows PC版微信内置浏览器调试(更新版)

前言 在日常的开发中&#xff0c;尤其是在微信公众号的相关开发中&#xff0c;我们需要进行微信端的调试&#xff0c;如果是后端开发&#xff0c;频率会更高。早期的微信版本&#xff0c;还支持查看网页元素以及接口请求&#xff0c;近年来&#xff0c;微信将这个功能频闭掉了…

链动2+1:打造企业级社交电商新篇章

随着互联网的迅猛发展&#xff0c;社交电商已成为商业领域的新宠。而在众多社交电商模式中&#xff0c;链动21模式以其独特的优势和魅力&#xff0c;正逐渐成为企业级用户的首选。本文将深入探讨链动21模式的优势&#xff0c;以及如何助力企业级用户实现商业成功。 一、链动21模…

vue环境安装 nodejs和vue

npm 是 NodeJS 下的包管理器,vue-cli脚手架模板就是基于 node 下的 npm 来完成安装的。 webpack: 它的主要用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资源的合并和打包。 vue-cli:官方提供的一个脚手架,用于快速生成一个 vue 的项目模板。…

精通Python第16篇—深入解析Pyecharts极坐标系参数与实战

文章目录 Pyecharts绘制多种炫酷极坐标系参数说明与方向的技术博客1. 导入必要的库2. 极坐标系基础3. 定制化极坐标系4. 方向性的极坐标系5. 极坐标系的动画效果6. 自定义极坐标轴标签7. 添加极坐标系的背景图8. 极坐标系的雷达图总结 Pyecharts绘制多种炫酷极坐标系参数说明与…

Unity触发检测Trigger踩坑合集

正常状态 绿色方块&#xff1a;刚体碰撞盒检测触发碰撞脚本 蓝色方块&#xff1a;碰撞盒 检测脚本&#xff1a; 正常进出&#xff1a; 踩坑1 绿色方块&#xff1a;刚体碰撞盒检测触发碰撞脚本 蓝色方块&#xff1a;碰撞盒 保持绿色和蓝色方块的接触 对蓝色方块&#xff1a…

http代理与socks5代理有什么差异,http代理出现502错误如何修复?

一、HTTP代理与SOCKS5代理的差异HTTP代理和SOCKS5代理都是网络代理服务的两种主要类型&#xff0c;但它们在实现方式和应用场景上存在明显的差异。1.协议差异HTTP代理基于HTTP协议&#xff0c;是一种应用层代理&#xff0c;主要用于代理HTTP请求和响应。而SOCKS5代理则基于SOCK…

幻兽帕鲁服务器一键部署保姆教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。 想要部署属于自…

BC1.2 SDP/CDP/DCP介绍

参考&#xff1a;文章链接 Microchip Lightning Support 问题 Q1.) 在Microchip产品的数据表中提到了电池充电技术&#xff0c;但以下术语是什么意思: BC1.2? SDP? CDP? DCP? “SE1”? Q2.) 如何配置Microchip Hub以启用这些功能&#xff1f; Q3.) 如何在我的硬件上物…
最新文章