MySQL之索引优化
1、在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引
-
例如下面的查询不能使用 actor_id 列的索引:
-
#这是错误的
-
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
-
优化方式:可以将表达式、函数操作移动到等号右侧。如下:
-
SELECT actor_id FROM sakila.actor WHERE actor_id = 5 - 1;
-
2、在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好
-
例如下面的语句中,最好把actor_id 和 film_id 设置为多列索引。猿辅导有道题,详见链接,可以让理解更深刻。
-
SELECT film_id, actor_ id FROM sakila.film_actor
-
WHERE actor_id = 1 AND film_id = 1;
-
3、让选择性最强的索引列放在前面。 见MySql最左前缀原则 索引的选择性是指:不重复的索引值和记录总数的比值。最大值为 1,此时每个记录都有唯一的索引与其对应。选择性越高,每个记录的区分度越高,查询效率也越高
-
例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。
-
复制代码
-
SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity,
-
COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity,
-
COUNT(*)
-
FROM payment;
-
#结果如下
-
staff_id_selectivity: 0.0001
-
customer_id_selectivity: 0.0373
-
COUNT(*): 16049
-
4、对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。 前缀长度的选取需要根据索引选择性来确定
-
5、索引包含所有需要查询的字段的值。具有以下优点: 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。 一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。 对于 InnoDB 引擎,若辅助索引能够覆盖查询,则无需访问主索引
-
6、mysql在使用like进行模糊查询的时候把%放后面,避免开头模糊查询 因为mysql在使用like查询的时候只有使用后面的%时,才会使用到索引
-
如:'%ptd_' 和 '%ptd_%' 都没有用到索引;而 'ptd_%' 使用了索引。
-
复制代码
-
#进行全表查询,没有用到索引
-
EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';
-
EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_';
-
#有用到索引
-
EXPLAIN SELECT * FROM `user` WHERE username LIKE 'ptd_%';
-
复制代码
-
再比如:经常用到的查询数据库中姓张的所有人:
-
SELECT * FROM `user` WHERE username LIKE '张%';
-
7、在表中建立索引,优先考虑where、group by使用到的字段
-
8、 尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描
-
比如:
-
SELECT * FROM t WHERE id IN (2,3)
-
SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)
-
优化方式:如果是连续数值,可以用between代替。如下:
-
SELECT * FROM t WHERE id BETWEEN 2 AND 3
-
如果是子查询,可以用exists代替。如下:
-
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)
-
9、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描
-
如:
-
SELECT * FROM t WHERE id = 1 OR id = 3
-
优化方式:可以用union代替or。如下:
-
SELECT * FROM t WHERE id = 1
-
UNION
-
SELECT * FROM t WHERE id = 3
-
10、 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描
-
SELECT * FROM t WHERE score IS NULL
-
优化方式:可以给字段添加默认值0,对0值进行判断。如下:
-
SELECT * FROM t WHERE score = 0
-
11、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描
-
例如:
-
SELECT * FROM t2 WHERE score/10 = 9
-
SELECT * FROM t2 WHERE SUBSTR(username,1,2) = 'li'
-
优化方式:可以将表达式、函数操作移动到等号右侧。如下:
-
SELECT * FROM t2 WHERE score = 10*9
-
SELECT * FROM t2 WHERE username LIKE 'li%'
-
-
-
12、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描
-
SELECT * FROM t WHERE 1=1
-
优化方式:用代码拼装sql时进行判断,没where加where,有where加and。
-
-
13、建立索引后,查询时不会扫描全表,而会查询索引表锁定结果
-
14、在数据库进行DML操作的时候,除了维护数据表之外,还需要维护索引表,运维成本增加
-
15、选用选择性高的字段作为索引,一般unique的选择性最高
-
16、复合索引:选择性越高的排在越前面。(左前缀原则);
-
17、如果查询条件中两个条件都是选择性高的,最好都建索引
-
18、 数据类型出现隐式转换时也不会使用索引
-
让我们对上一个例子中的表增加一个 AGE 索引。
-
CREATE TABLE `test_index_table` (
-
`id` int(11) NOT NULL AUTO_INCREMENT,
-
`name` varchar(45) DEFAULT NULL,
-
`birthday` datetime DEFAULT NULL,
-
`address` varchar(45) DEFAULT NULL,
-
`phone` varchar(45) DEFAULT NULL,
-
`note` varchar(45) DEFAULT NULL,
-
`age` varchar(11) DEFAULT NULL,
-
PRIMARY KEY (`id`),
-
KEY `NAME_ADDRESS` (`name`,`id`) USING BTREE,
-
KEY `AGE` (`age`) USING BTREE
-
) ENGINE=InnoDB AUTO_INCREMENT=283 DEFAULT CHARSET=utf8
-
尝试使用下面的 sql 语句进行查询
-
explain SELECT * FROM test.test_index_table where age = 26
-
由于表中的 age 是 VARCHAR 类型。而在 sql 语句中我们使用的是数字类型 26。MYSQL 默认会把输入的常量值进行转换以后才进行检索。现在我们通过 explain 看看这个语句的分析结果
-
-
19、查看索引使用情况
-
show status like 'handler_read%';
-
-
20、mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。 因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引
-
-
-
-
-
相关文章:
MySQL之索引优化
1、在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引 例如下面的查询不能使用 actor_id 列的索引: #这是错误的 SELECT actor_id FROM sakila.actor WHERE actor_id 1 5; 优化方式:…...
Spring Boot 与 Amazon S3:快速上传与下载文件的完整指南
概要 在将 Spring Boot 更新到 3 系列时,由于 javax 需要被替换为 jakarta,因此原先依赖于 javax 的 spring-cloud-starter-aws1 将无法使用(虽然在我本地环境中仍然可以正常工作)。为了确保兼容性,我将依赖关系更改为…...
细节剖析:HTTP与HTTPS在安全性、性能等方面的不同!
HTTPS是现代互联网通信的重要基石,通过加密通信、身份验证和数据完整性保护,为数十亿用户提供了安全可靠的互联网体验。 小编整理了2GB程序员相关资料,关注微信公众号“程序员Style”回复“程序员”免费领取! 1、介绍 随着 HTT…...
MySQL面试篇章——MySQL索引
文章目录 MySQL 索引索引分类索引创建和删除索引的执行过程explain 查看执行计划explain 结果字段分析 索引的底层实现原理B-树B树哈希索引 聚集和非聚集索引MyISAM(\*.MYD,*.MYI)主键索引辅助索引(二级索引) InnoDB&a…...
WSL 2 Oracle Linux 9.1 安装配置
文章目录 环境使用体验安装 Oracle Linux 9.1修改默认存储路径默认 root 用户登录启用 systemd启用 SSH 连接WSL 无法 ping 通宿主机和域名WSL 使用主机代理(测试通过)WSL 常用命令 环境 OS:Win11 24H2 (OS 内部版本26120.1252) wsl --versio…...
MySQL日志文件详解
MySQL中的日志文件是MySQL数据库系统的重要组成部分,它们记录了数据库的运行情况、用户操作、错误信息等,对于数据库的维护、优化、故障排查和恢复都具有重要意义。以下是MySQL中几种主要日志文件的详解: 1. 二进制日志(Binary L…...
MySQL零散拾遗(三)
在mysql中,JOIN ON 和 WHERE 的作用和用法是怎么样的? 在MySQL中,JOIN语句用于将两个或多个表根据指定的关联条件合并成一个新的结果集。JOIN ON和WHERE子句在JOIN语句中扮演着不同的角色,它们的用法和作用如下: JOI…...
鸿蒙 使用 Refresh 实现下拉刷新
import promptAction from ohos.promptActionEntry Component struct Index {Staterefreshing: boolean falseStatelist: number[] Array(20).fill(Date.now())Buildercontent(){Stack(){Row(){LoadingProgress().height(32)Text(正在刷新...).fontSize(16).margin({left:20}…...
【JavaScript 算法】图的遍历:理解图的结构
🔥 个人主页:空白诗 文章目录 一、深度优先搜索(DFS)深度优先搜索的步骤深度优先搜索的JavaScript实现 二、广度优先搜索(BFS)广度优先搜索的步骤 三、应用场景四、总结 图的遍历是图论中的基本操作之一&am…...
Ubuntu 中默认的 root 用户密码
场景:想要切换root用户,发现得输入密码,以为是以前设置过然后一直尝试都是错误【认证失败】最后发现根本没设置过root用户,默认会随机生成root用户的密码😅 Ubuntu 中默认的 root 密码是随机的,即每次开机都…...
Rust编程-高级特性
unsafe:内存不安全 内存安全问题,例如空指针解引用 关键字unsafe来切换到不安全模式,并在被标记后的代码块中使用不安全代码 使用unsafe告诉编译器后面代码安全性自行负责 因为电脑硬件安全问题,必须编写可能不安全的代码 可以将…...
JavaRegexImprove练习(1) (2024.7.22)
ImproveExercise1 package RegexImprove20240722; import java.util.Scanner; public class ImproveExercise {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.nextLine();//…...
基于YOLO模型的鸟类识别系统
鸟类识别在生物研究和保护中具有重要意义。本文将详细介绍如何使用YOLO(You Only Look Once)模型构建一个鸟类识别系统,包括UI界面、YOLOv8/v7/v6/v5代码以及训练数据集。 目录 2. 环境配置 2.1 安装Python和相关库 2.2 安装YOLO模型库 …...
WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)
文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码,然后发送给B端,B端怎么解码? B端视频采用…...
面试场景题系列--(1)如果系统的 QPS 突然提升 10 倍该怎么设计?--xunznux
1. 如果系统的 QPS 突然提升 10 倍该怎么设计? 1.1 硬件的扩展微服务的拆分 如果所有的业务包括交易系统、会员信息、库存、商品等等都夹杂在一起,当流量一旦起来之后,单体架构的问题就暴露出来了,机器挂了所有的业务就全部无法…...
【数学建模】——前沿图与网络模型:新时代算法解析与应用
目录 1.图与网络的基本概念 1. 无向图和有向图 2. 简单图、完全图、赋权图 3. 顶点的度 4. 子图与图的连通性 2.图的矩阵表示 1. 关联矩阵 2. 邻接矩阵 3.最短路问题 1.Dijkstra 算法 2.Floyd 算法 4.最小生成树问题 1.Kruskal 算法 2.Prim 算法 5.着色问题 6.…...
视频分帧【截取图片】(YOLO目标检测【生成数据集】)
高效率制作数据集【按这个流程走,速度很顶】 本次制作,1059张图片【马路上流动车辆】 几乎就是全自动了,只要视频拍得好,YOLO辅助制作数据集就效率极高 视频中的图片抽取: 【由于视频内存过大,遇到报错执行…...
Redis7(二)Redis持久化双雄
持久化之RDB RDB的持久化方式是在指定时间间隔,执行数据集的时间点快照。也就是在指定的时间间隔将内存中的数据集快照写入磁盘,也就是Snapshot内存快照,它恢复时再将硬盘快照文件直接读回到内存里面。 RDB保存的是dump.rdb文件。 自动触发…...
发布支持TS的npm包
你现在有这么一个包,已经将他发布在npm上了,周下载量也还比较可观。美中不足的就是,这个包之前使用js写的,现在你想增加TS类型,提升用户使用体验,那么你现在可以做以下几个步骤 1.在你的包的根目录下创建一…...
计算机视觉9 全卷积网络
全卷积网络(Fully Convolutional Network,简称 FCN)在计算机视觉领域具有重要地位。 传统的卷积神经网络(CNN)在最后的输出层通常使用全连接层来进行分类任务。然而,全连接层会丢失空间信息,使得…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
