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 < 10id 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站学习原版视频&…...
什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏
随着科技的飞速发展,传统的场馆展示方式已经无法满足现代人对信息获取和体验的需求。智慧场馆大屏作为一种新型的展示方式,应运而生。它将高清大屏显示技术、智能交互技术、数据分析技术等融为一体,为观众带来更加丰富、生动的展示体验。 一…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
