MySQL 索引相关基本概念

news2024/11/10 0:58:14

文章目录

    • 前言
    • 一. B+ Tree 索引
      • 1. 概念
      • 2. 聚集索引/聚簇索引
      • 3. 辅助索引/二级索引
      • 4. 回表
      • 5. 联合索引/复合索引
      • 6. 覆盖索引
    • 二. 哈希索引
    • 三. 全文索引

前言

InnoDB存储引擎支持以下几种常见索引:B+Tree索引,哈希索引,全文索引

一. B+ Tree 索引

1. 概念

B+Tree 是一种为了快速检索数据的一种数据结构,但数据才是我们真正需要的数据,索引只是辅助数据,用来便于查找我们需要的数据。

2. 聚集索引/聚簇索引

Innodb使用的聚簇索引,将表中主键作为索引从而构建一颗B+Tree,并将整表数据的行记录存放在B+Tree的叶子结点。从而延伸出索引即数据,数据即索引。

聚簇索引是由表中主键构成,所以一张表只有一个聚簇索引。如:

alter table test_table on PRIMARY KEY (id);

聚簇索引的叶子结点为数据页。数据页存放着完整的每行数据

延伸出聚簇索引优势:

  1. 通过聚簇索引即可获取完整的整行记录。
  2. 对于主键排序查询及范围查询,速度是非常快的,性能是非常高效的。

如果未定义主键索引,MySQL会使用唯一索引,没有唯一索引,MySQL会创建一个隐含列RowID作为主键,用这个主键来建立聚簇索引。

3. 辅助索引/二级索引

聚簇索引使用在搜索条件为主键值的时候,因为B+Tree都是按照主键进行排序的。

若以别的列作为搜索条件时,就需延伸出二级索引。如:

create index idx_a on test_table (a);

每建立一个索引,就需要一个B+Tree。

对于二级索引,叶子节点不包含行记录的完整数据,叶子节点包含键值,每个叶子节点的索引行还包含一个书签(Bookmark),书签用来告诉InnoDB如何回查对应索引行的完整数据。InnoDB引擎的二级索引书签就是对应行数据的聚簇索引。

4. 回表

辅助索引不影响数据在聚簇索引的组织结构(聚簇索引的叶子节点存储着完整的数据行),因此表中可以有多个辅助索引。

当返回的列字段不符合辅助索引所包含的索引行时,InnoDB引擎会遍历辅助索引并通过其叶子级的指针,获得聚簇索引(Bookmark)指向的主键,通过聚簇索引来获取对应索引行的完整记录。这个过程称为回表。

根据辅助索引的值查询一条完整的行记录需要使用2颗B+Tree:

  1. 一次辅助索引的B+Tree
  2. 一次聚簇索引的B+Tree

若把所有行用于辅助索引创建,是不是不用回表了?

是的,但太占磁盘空间了,相当于每建立一个辅助索引,需要把表中所有数据拷贝一遍。每次对数据的变化要在所包含数据的索引中进行一次的全部修改,性能消耗非常大。

回表次数越少,性能越高。若回表次数越多,二级索引性能越低,有时候甚至会使用全局扫表,也不会使用二级索引。

对于全局扫表,二级索引+回表操作?

查询优化器通过事先对表中的记录计算一些统计数据,用这个结果根据查询条件来计算回表的记录数,回表记录数越多,越倾向全局扫表,反之倾向二级索引+回表操作。

5. 联合索引/复合索引

前面提及的辅助索引/二级索引,我们只对一个字段进行构建索引。但实际工作中,可以对多个字段进行构建索引,延伸出联合索引的概念。

多个列组合起来创建的索引,称为联合索引/复合索引,如:

create index idx_a_b on test_table (a,b);

在这个index(a,b),包含两个意思:

  1. 把各个记录,按照a的列进行排序
  2. 在a列值相同情况下,进行b列值的排序

6. 覆盖索引

InnoDB存储引擎支持覆盖索引(covering index,别称:索引覆盖)。

即从辅助索引中可以得到查询的记录,而不需要查询聚簇索引中的记录(回表)。

覆盖索引带来的好处就是,若查询指定的几个字段的话,辅助索引不包含完整索引行记录信息,大小要远小于聚簇索引,因此可以减少大量的IO操作。

覆盖索引不是索引类型的一种。

二. 哈希索引

B+Tree 查找次数,取决于B+Tree的高度,在生产环境,B+Tree的高度一般为3,4层,故需3,4次的IO查询。

InnoDB存储引擎内部自己去监控表,如果监控到某个索引经常被使用,那就会认为是个热数据,内部创建一个hash索引,称之为自适应hash索引(Adaptive Hash Index,AHI)。

创建后,下次查询若还用到此索引,InnoDB会通过hash算法推导出记录的地址,直接一次就能查询数据,相对于重复查询B+Tree索引中查询3,4次节点效率显著提高。

InnoDB存储引擎使用的哈希函数采用除法散列方式,其冲突机制采用链表方式。对于自适应哈希索引,仅是数据库层面自行创建使用,我们不能进行干预。

在这里插入图片描述

show engine innodb status

show engine innodb status;

-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 1 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 5 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

哈希索引只能用来搜索等值,也就是所谓的精确匹配查询。如:

select * from test_table where a = xxx

而对于其他的查找类型,如范围查询,不能使用哈希索引的。

因此在show engine innodb status的结果中,出现了non-hash searches/s的情况。通过hash searches/s;non-hah searches/s可以大概了解到哈希索引使用的效率

开启/关闭自适应哈希索引,默认AHI是开启状态。

  1. 使用my.cnfmy.ini配置文件:

    编辑MySQL的配置文件(通常为my.cnf或my.ini), 在[mysqld][innodb]添加以下行:

    [mysqld]
    innodb_adaptive_hash_index=OFF
    

    [innodb]
    innodb_adaptive_hash_index=OFF
    
  2. 在MySQL客户端:

    -- 关闭
    SET GLOBAL innodb_adaptive_hash_index = OFF;
    -- 开启
    SET GLOBAL innodb_adaptive_hash_index = ON;
    
  3. 在启动MySQL服务时:

    mysqld --innodb_adaptive_hash_index=OFF
    

三. 全文索引

将存储于数据库的整本书/整篇文章中的任意内容信息查找出来,称为全文索引(Full-Text Search),可根据全文中的章,节,段,句等信息,进行各种统计及分析。如ES,Solr等就是全文检索引擎,底层是基于Apache Lucene。

全文索引通常只适用于VARCHAR, CHAR, 和 TEXT类型的列。每张表只能有一个全文检索索引,MySQL的全文搜索支持英文和其他一些语言,但对于中文等非拉丁字母语言的支持有限。在这种情况下,可能需要使用第三方插件(如myisam_ftinnodb_ft)或外部全文搜索引擎(如Elasticsearch)来实现更高级的全文搜索功能。

创建全文索引:

alter table test_table add fulltext(content);

全文搜索

select * from test_table where match(content) against(xx);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1、hadoop环境搭建

1、环境配置 ip(/etc/sysconfig/network-scripts) # 网卡1 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOstatic IPADDR192.168.59.11 GATEWAY192.168.59.1 NETMASK 255.255.255.0 # 网卡2 DEVICEeht0 TYPEEthernet ONBOOTyes NM_CONTROLLEDyes BOOTPROTOdh…

均匀圆形阵列原理及MATLAB仿真

均匀圆形阵列原理及MATLAB仿真 目录 前言 一、均匀圆阵原理 二、圆心不存在阵元方向图仿真 三、圆心存在阵元方向图仿真 四、MATLAB仿真代码 总结 前言 本文详细推导了均匀圆形阵列的方向图函数,对圆心不放置阵元和圆心放置阵元的均匀圆形阵列方向图都进行了仿…

前端JS特效第57波:响应式博客网站图文幻灯片

响应式博客网站图文幻灯片&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head> <meta charset"utf-8"> <title>响应式博客幻灯片演示</title><link …

pyuic5将ui文件转换为py文件报错:one input ui-file must be specified;no element found;

ERROR 1 文件命名不规范Solution 1:文件命名不能有空格 ERROR 2未选中ui文件 Solution 2:选中要转换成py 的文件

深入解析:百数平台图表联动功能设置与实战应用

在当今数据驱动的时代&#xff0c;图表的联动功能已成为数据分析的得力助手。通过深度整合各类图表&#xff0c;如柱形图、折线图、饼图、雷达图、条形图、透视图、面积图、双轴图、地图以及漏斗图等&#xff0c;我们实现了图表之间的无缝衔接&#xff0c;使得数据的呈现与探索…

基于FFmpeg和SDL的音视频解码播放的实现过程与相关细节

目录 1、视频播放器原理 2、FFMPEG解码 2.1 FFMPEG库 2.2、数据类型 2.3、解码 2.3.1、接口函数 2.3.2、解码流程 3、SDL播放 3.1、接口函数 3.2、视频播放 3.3、音频播放 4、音视频的同步 4.1、获取音频的播放时间戳 4.2、获取当前视频帧时间戳 4.3、获取视…

RFID标签打印机助力服装厂实现智能化管理

随着服装行业的快速发展&#xff0c;传统的管理模式已无法满足现代化生产的需求。RFID技术作为一种先进的自动识别技术&#xff0c;正在改变服装厂的管理方式。常达智能物联致力于为客户提供高效的RFID解决方案&#xff0c;其中RFID标签打印机在服装厂的应用尤为重要。本文将探…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之LCR 179. 查找总价格为目标值的两个商品&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法…

C++学习笔记——模板

学习视频 文章目录 模板的概念函数模板函数模板语法函数模板注意事项函数模板案例普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性 类模板类模板与函数模板区别类模板中成员函数创建时机类模板对象做函数参数类模板与继承类模板成员函数类外实现类模板分文件…

2024年钉钉杯大数据竞赛A题超详细解题思路+python代码手把手保姆级运行讲解视频+问题一代码分享

初赛A&#xff1a;烟草营销案例数据分析 AB题综合难度不大&#xff0c;难度可以视作0.4个国赛&#xff0c;题量可以看作0.35个国赛题量。适合于国赛前队伍练手&#xff0c;队伍内磨合。竞赛获奖率50%&#xff0c;八月底出成绩&#xff0c;参赛人数3000队左右。本文将为大家进行…

docker安装部署elasticsearch7.15.2

docker安装部署elasticsearch7.15.2 1.拉取es镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2如果不想下载或者镜像拉去太慢可以直接下载文章上面的镜像压缩包 使用镜像解压命令 docker load -i elasticsearch-7-15-2.tar如下图所示就表示镜像解压成…

基于GitHub page和Hexo主题搭建个人博客(win)

1.安装git git官网下载地址&#xff1a;Git - Downloads (git-scm.com) (1)下载&#xff1a;进入官网&#xff0c;选择对应版本下载&#xff0c;得到.exe文件 (2)安装&#xff1a;打开.exe文件&#xff0c;进行如下操作 (3)安装好后&#xff0c;右击鼠标&#xff0c;点击显示…

大数据学习之Flink基础

Flink基础 1、系统时间与时间时间 系统时间&#xff08;处理时间&#xff09; 在Sparksreaming的任务计算时&#xff0c;使用的是系统时间。 假设所用窗口为滚动窗口&#xff0c;大小为5分钟。那么每五分钟&#xff0c;都会对接收的数据进行提交任务. 但是&#xff0c;这里有…

深度学习的前沿主题:GANs、自监督学习和Transformer模型

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;1. 介绍 深度学习在人工智能领域中占据了重要地位&#xff0c;特别是生成对抗网络&#xff08;GANs&#xff09;、自监督学习和Transformer模型的出现&#xff0c;推动了图像生成、自然语言处理等多个领域的创…

AI跟踪报道第49期-新加坡内哥谈技术-本周AI新闻: 开源AI王者归来的一周

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

杭州社保卡办理-农业银行版本

step 1、杭州滨江高新支行 被告知只能工作日办理&#xff08;由于工作时间冲突&#xff0c;办理不了&#xff09; 询问哪个支行可以办&#xff0c;回答说不知道&#xff0c;让我自己去问。银行服务态度较差。 step 2、杭州滨江江南支行 市民卡显示这家&#xff0c;周六可以…

QT开发(QT的基本概述和环境的安装)

QT的概述 一.QT的介绍背景1.1 什么是QT1.2QT的发展史1.3 Qt支持的平台1.4QT版本1.5QT的优点1.6QT的应用场景 二.搭建QT开发环境2.1 QT的开发工具的下载2.2 QT环境变量配置 三.QT的三种基类四.QT Hello World程序4.1使用按钮实现4.1.1 代码方式实现4.1.2 可视化操作实现 一.QT的…

Java_如何在IDEA中使用Git

注意&#xff1a;进行操作前首先要确保已经下载git&#xff0c;在IDEA中可以下载git&#xff0c;但是速度很慢&#xff0c;可以挂梯子下载。 导入git仓库代码 第一次导入&#xff1a; 首先得到要加载的git仓库的url&#xff1a; 在git仓库中点击 “克隆/下载” 按钮&#xf…

【马斯洛需求层次理论】

马斯洛层次需求理论指导人生 作者 π 作者前言&#xff1a; 我认为人生是要一些原则和理论支撑指导的&#xff0c;不然人就很容易失去方向&#xff0c;动力。活得也会非常的累。 有时候不仅不自知&#xff0c;很多情况下不能理解他人的行为和感受。这就是让自己的社交变得很不…