mysql - 索引基本知识梳理
mysql索引基本知识梳理
索引介绍
官方介绍索引是帮助MySQL高效获取数据的数据结构, 原理为以空间换时间, mysql的索引采用的是B+树的结构
索引的优缺点
优点:
- 提高查询效率
- 降低数据库IO成本
- 通过索引对数据进行排序, 降低排序成本, 降低CPU消耗
缺点:
- 索引会占用磁盘空间
- 降低更新表的效率
对数据进行增删改操作时, 除了保存数据外, 还要更新索引文件, 且耗时随着数据量增加而增加
索引类型
-
主键索引 primary key
索引列中的值必须是唯一的, 不允许有空值。 -
唯一索引 unique
索引列中的值必须是唯一的, 但是允许为空值。 -
普通索引 normal
MySQL中基本索引类型, 没有什么限制, 允许在定义索引的列中插入重复值和空值。 -
全文索引 Full Text
只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时, 如果创建普通索引, 在进行like模糊查询时效率比较低, 这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。 -
空间索引 spatial
MySQL在5.7之后的版本支持了空间索引, 而且支持OpenGIS几何数据模型。MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。 -
前缀索引
在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时, 可以指定索引列的长度, 但是数值类型不能指定。 -
其他(按照索引列数量分类)
- 单列索引
- 组合索引
组合索引的使用, 需要遵循最左前缀匹配原则(最左匹配原则)。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。
索引的创建和使用
假设以用户基本信息表为例, sql如下:
-- 创建表时, 创建索引
CREATE TABLE `user` (`id` int NOT NULL COMMENT 'id',`name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '姓名',`age` int NOT NULL COMMENT '年龄',`sex` tinyint(1) NOT NULL COMMENT '性别',`phone` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '电话',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
查看表索引
SHOW INDEX FROM 【tableName】;-- 就例子中的user表, 具体sql如下:
-- SHOW INDEX FROM user;
索引结果如下:
Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user | 0 | P R I M A R Y \color{#f56c6c}{PRIMARY} PRIMARY | 1 | id | A | 0 | ( N u l l ) \color{#909399}{(Null)} (Null) | ( N u l l ) \color{#909399}{(Null)} (Null) | BTREE | YES | ( N u l l ) \color{#909399}{(Null)} (Null) |
- Non_unique 是否非唯一, 这里说明主键也是唯一键
- Key_name 主键索引名称默认为
PRIMARY
- Seq_in_index 索引序号递增
- Column_name 为索引所在列明
- Index_type 索引数据类型为B树(说明:是B+树)
单列索引
-
创建普通索引
CREATE INDEX 【indexName】 ON 【tableName】(【columnName】);-- 就例子中的user表, 对name字段添加索引, 具体sql如下: -- CREATE INDEX idx_name ON user(name);
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression user 0 PRIMARY 1 id A 0 ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) BTREE YES ( N u l l ) \color{#909399}{(Null)} (Null) user 1 i d x _ n a m e \color{#f56c6c}{idx\_name} idx_name 1 name A 0 ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) BTREE YES ( N u l l ) \color{#909399}{(Null)} (Null) - Non_unique 是否非唯一, 这里说明普通索引不是唯一
-
创建唯一索引
CREATE UNIQUE INDEX 【indexName】 ON 【tableName】(【columnName】);-- 就例子中的user表, 对phone字段添加唯一索引, 具体sql如下: -- CREATE UNIQUE INDEX idx_phone ON user(phone);
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression user 0 PRIMARY 1 id A 0 ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) BTREE YES ( N u l l ) \color{#909399}{(Null)} (Null) user 0 i d x _ p h o n e \color{#f56c6c}{idx\_phone} idx_phone 1 phone A 0 ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) BTREE YES ( N u l l ) \color{#909399}{(Null)} (Null) - Non_unique 是否非唯一, 唯一索引肯定是唯一
联合索引
创建索引
CREATE UNIQUE INDEX 【indexName】 ON 【tableName】(【columnName1】,【columnName2】,...,【columnNameN】);-- 就例子中的user表, 对name和age和sex字段添加联合索引, 具体sql如下:
-- CREATE INDEX idx_name_age_sex ON user(name, age, sex);
Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
user | 0 | PRIMARY | 1 | id | A | 0 | ( N u l l ) \color{#909399}{(Null)} (Null) | ( N u l l ) \color{#909399}{(Null)} (Null) | BTREE | YES | ( N u l l ) \color{#909399}{(Null)} (Null) | |||
user | 1 | i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex | 1 \color{#f56c6c}{1} 1 | name | A | 0 | ( N u l l ) \color{#909399}{(Null)} (Null) | ( N u l l ) \color{#909399}{(Null)} (Null) | BTREE | YES | ( N u l l ) \color{#909399}{(Null)} (Null) | |||
user | 1 | i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex | 2 \color{#f56c6c}{2} 2 | age | A | 0 | ( N u l l ) \color{#909399}{(Null)} (Null) | ( N u l l ) \color{#909399}{(Null)} (Null) | BTREE | YES | ( N u l l ) \color{#909399}{(Null)} (Null) | |||
user | 1 | i d x _ n a m e _ a g e _ s e x \color{#f56c6c}{idx\_name\_age\_sex} idx_name_age_sex | 3 \color{#f56c6c}{3} 3 | sex | A | 0 | ( N u l l ) \color{#909399}{(Null)} (Null) | ( N u l l ) \color{#909399}{(Null)} (Null) | BTREE | YES | ( N u l l ) \color{#909399}{(Null)} (Null) |
- 由结果可看出, 联合索引是多行数据存在数据库中, 且Seq_in_index是按顺序递增的
联合索引的意义
-
减少开销
建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!
-
覆盖索引
对联合索引(col1,col2,col3),如果有如下的sql:
select col1,col2,col3 from tableName where col1=1 and col2=2
。那么MySQL可以直接通过便利索引取得数据,无需回表,较少io操作。实际应用中,覆盖索引是主要的提升性能的优化手段之一。 -
效率高
索引列越多,通过索引筛选出来的数据越少。
假设有1000w数据,
select col1,col2,col3 from tableName where col1=1 and col2=2 and col3=3
, 假设每个条件可筛选出10%的数据,如果使用单列索引,假设索引列为col1,则筛选出来的数据为1000w * 10 % = 100w
条数据,然后再回表从100w条数据中找到符合剩下条件的数据,再进行排序和分页等操作。但如果是联合索引,通过索引直接能筛选出1000w * 10% * 10% * 10% = 1w
条数据,性能有明显提升。
最左前缀匹配
在谈最左前缀匹配前, 可先了解mysql中explain的用法。
下列实例中, 表结构为:
CREATE TABLE `user` (`id` int NOT NULL COMMENT 'id',`name` varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '姓名',`age` int NOT NULL COMMENT '年龄',`sex` tinyint(1) NOT NULL COMMENT '性别',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '电话',PRIMARY KEY (`id`),KEY `idx_name_age_sex` (`name`,`age`,`sex`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
先往user表中插入若干数据
-
全值匹配
符合最左前缀匹配原则
select * from user where name = ? and age = ? and sex = ? select * from user where name = ? and sex = ? and age = ? select * from user where age = ? and name = ? and sex = ? select * from user where age = ? and sex = ? and name = ?
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ref idx_name_age_sex idx_name_age_sex 1027 const,const,const 1 100.00 ( N u l l ) \color{#909399}{(Null)} (Null) sql语句中字段的顺序不需要和联合索引定义的字段顺序相同, 查询优化器会判断纠正这条SQL语句以什么样的顺序执行效率高, 最后才能生成真正的执行计划
-
匹配最左边的列
符合最左前缀匹配原则
select * from user where name = ?
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ref idx_name_age_sex idx_name_age_sex 1022 const 1 100.00 ( N u l l ) \color{#909399}{(Null)} (Null) 只是name命中索引时, key_len为1022
select * from user where name = ? and age = ?
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ref idx_name_age_sex idx_name_age_sex 1026 const 1 100.00 ( N u l l ) \color{#909399}{(Null)} (Null) name和age命中索引时, key_len为1026, 比仅name命中时, key_len大4, 是因为int的长度是4个字节
select * from user where name = ? and sex = ?
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ref idx_name_age_sex idx_name_age_sex 1022 const 1 100.00 Using index condition -
匹配列前缀
对于字符串类型, 模糊匹配中的前缀匹配, 用的是索引, 中缀和后缀走的全表扫描
-
前缀匹配 – 走索引
explain select * from user where name like 'user1%';
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ref idx_name_age_sex idx_name_age_sex 1022 const 11 100.00 Using index condition -
中缀匹配 – 不走索引
explain select * from user where name like '%user1%';
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ALL ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) 99 11.11 Using where -
后缀匹配 – 不走索引
explain select * from user where name like '%user1';
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) ALL ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) ( N u l l ) \color{#909399}{(Null)} (Null) 99 11.11 Using where
-
-
匹配范围值
explain select * from user where id > 1;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) range PRIMARY PRIMARY 4 ( N u l l ) \color{#909399}{(Null)} (Null) 98 100.00 Using where 最左前缀匹配原则遇到<>, 就会停止匹配, 但是由于id本身是有序的, 由上述结果可知, 该查询使用了id索引, 且为range范围查询
explain select * from user where id > 1 and age < 10
id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE user ( N u l l ) \color{#909399}{(Null)} (Null) range PRIMARY PRIMARY 4 ( N u l l ) \color{#909399}{(Null)} (Null) 98 33.33 Using where 由于不遵循最左匹配原则,使用的是range扫描。
相关文章:
mysql - 索引基本知识梳理
mysql索引基本知识梳理 索引介绍 官方介绍索引是帮助MySQL高效获取数据的数据结构, 原理为以空间换时间, mysql的索引采用的是B树的结构 索引的优缺点 优点: 提高查询效率降低数据库IO成本通过索引对数据进行排序, 降低排序成本, 降低CPU消耗 缺点:…...
Nginx SSL/TLS配置:搭建安全的HTTPS网站
随着互联网安全性的日益提升,HTTPS已经成为网站安全通信的标配。Nginx作为一款高性能的HTTP和反向代理服务器,支持SSL/TLS协议,使得我们可以轻松地搭建安全的HTTPS网站。下面,我们将详细介绍如何在Nginx上配置SSL/TLS,…...
echarts 折线图流光效果偏移或不显示
x轴数据需要字符串数组...

Redis数据类型(上篇)
前提:(key代表键) Redis常用的命令 命令作用keys *查看当前库所有的keyexists key判断某个key是否存在type key查看key是什么类型del key 删除指定的keyunlink key非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的…...

VMware虚拟机安装Linux
1.下载Linux的ISO镜像文件 阿里镜像源网站: https://developer.aliyun.com/mirror/ 清华大学镜像源网站: https://mirrors.tuna.tsinghua.edu.cn/本人选择的是:Centos7.9.2009标准版 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ 标准版&a…...
slurm是什么,怎么用? For slurm和For Pytorch有什么区别和联系?
1.slurm是什么? Slurm(Simple Linux Utility for Resource Management)是一种开源的、用于集群和超级计算机的作业调度系统。它主要用于管理和调度大规模计算任务,使得用户可以有效地利用集群中的计算资源。Slurm提供了一套功能强…...

类和对象【六】友元和内部类
文章目录 友元友元的作用友元的缺点友元函数语法:特点: 友元类语法:特点: 内部类概念特点 友元 友元的作用 友元提供了一种打破封装的方式,有时提供了便利。 友元的主要作用就是打破封装 即可以让一个类的友元函数…...

一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计
一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计 cv 方向Pytorch数据集划分 模型评估误差偏差方差噪声 输入尺寸方法一:让数据适应模型方法二:修改模型适应数据方法三:划分Patch,分别处理 目标检测器结构…...
Java-SpringBoot集成Langchain4j文本嵌入模型实现向量相似度查询
集成Pg数据库并创建vector字段类型 运行pgvector容器 根据需要进行容器目录挂载 docker run --name pgvector \-e POSTGRES_PASSWORD123456 \-p 5432:5432 \-d --platform linux/amd64 ankane/pgvector:latest 进入docker容器并创建vector字段类型 docker exec -it pgvecto…...

正宇软件:引领数字人大新纪元,开启甘肃人大代表履职新篇章
在数字化强国的主旋律之下,政府工作的数字化、智能化转型已成为提升治理效能、增强人民满意度的关键一环。在这个大背景下,正宇软件技术开发有限公司以其卓越的技术实力和丰富的行业经验,成为了政府信息化建设的杰出代表。甘肃省人大代表履职…...
UniApp中,在页面显示时触发子组件的重新渲染
在UniApp中,要在页面显示时触发子组件的重新渲染,可以利用生命周期钩子函数来实现。具体来说,可以在页面的onShow生命周期钩子中调用子组件的方法或者改变子组件的props,从而触发子组件的重新渲染。 首先,确保子组件有…...

Linux(三)
Linux(三) Linux网络配置管理网络基础知识 IP地址A类 由1个字节网络地址3个字节主机地址B类 由2个字节网络地址2个主机地址C类 由3个字节网络地址1个主机地址D类:主要用于组播E类:为将来使用保留 子网掩码子网掩码作用网关DNS服务器 Linux用户管理用户的…...
2024年郫都区区级农业生产社会化服务重点服务组织评定申报条件材料、程序要求
第一章 总 则 第一条 为深入贯彻《中共中央办公厅 国务院办公厅关于促进小农户和现代农业发展有机衔接的意见》《农业农村部关于加快发展农业社会化服务的指导意见》精神,充分发挥农业生产社会化服务组织在引领现代农业发展、打造新时代更高水平“天府粮仓”郫都…...
Java入门须知术语
文章目录 前言JVM (Java Virtual Machine)JVM的组成部分JVM的作用为什么需要JVM JRE(Java Runtime Environment)JRE的组成部分JRE的作用为什么需要JRE JDK(Java Development Kit,Java开发工具包)JDK的组成部分JDK的作用…...
Spring Boot中集成WebSocket
目录 WebSocket简介WebSocket原理WebSocket的使用场景在Spring Boot中集成WebSocket 创建Spring Boot项目添加依赖配置WebSocket创建WebSocket处理器配置WebSocket端点前端使用WebSocket添加WebSocket拦截器 WebSocket简介 WebSocket是一种在单个TCP连接上进行全双工通信的…...
18.多分类问题代码实现
在机器学习中,多分类问题是一类常见的问题,它涉及到将输入数据划分为多个类别中的一个。例如,在图像识别中,我们可能需要将图像分为不同的类别,如手写数字识别(MNIST数据集)就是将手写数字图像分…...

实时通信的方式——WebRTC
文章目录 基于WebRTC实现音视频通话P2P通信原理如何发现对方? 不同的音视频编解码能力如何沟通?(媒体协商SDP)如何联系上对方?(网络协商) 常用的API音视频采集getUserMedia核心对象RTCPeerConne…...

Android 使用 ActivityResultLauncher 申请权限
前面介绍了 Android 运行时权限。 其中,申请权限的步骤有些繁琐,需要用到:ActivityCompat.requestPermissions 函数和 onRequestPermissionsResult 回调函数,今天就借助 ActivityResultLauncher 来简化书写。 步骤1:创…...

如何将前端项目打包并部署到不同服务器环境
学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的,用于自己复盘,有需要学习的可以去b站学习原版视频&…...

什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏
随着科技的飞速发展,传统的场馆展示方式已经无法满足现代人对信息获取和体验的需求。智慧场馆大屏作为一种新型的展示方式,应运而生。它将高清大屏显示技术、智能交互技术、数据分析技术等融为一体,为观众带来更加丰富、生动的展示体验。 一…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...