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站学习原版视频&…...

什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏
随着科技的飞速发展,传统的场馆展示方式已经无法满足现代人对信息获取和体验的需求。智慧场馆大屏作为一种新型的展示方式,应运而生。它将高清大屏显示技术、智能交互技术、数据分析技术等融为一体,为观众带来更加丰富、生动的展示体验。 一…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...

解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...