MSQL系列(六) Mysql实战-SQL语句优化
Mysql实战-SQL语句优化
前面我们讲解了索引的存储结构,B+Tree的索引结构,以及索引最左侧匹配原则,Explain的用法,可以看到是否使用了索引,今天我们讲解一下SQL语句的优化及如何优化
文章目录
- Mysql实战-SQL语句优化
- 1.表结构
- 2 where语句及order的列 建立索引
- 3. where语句不要使用!=,<>
- 4.where语句不要or进行判断
- 5.where语句不要使用 like模糊查询
- 6.where语句 不要 in 和not in, 可能也会导致全表扫描
- 7.where语句不要使用表达式计算及函数运算
1.表结构
新建表结构 user, user_info
#新建表结构 user
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',`id_card` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '身份证ID',`user_name` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名字',`age` int NOT NULL COMMENT '年龄',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'
- id 主键id列
- id_card 身份证id
- user_name 用户姓名
- age 年龄
先插入测试数据, 插入 5条测试数据
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (1, '11', 'aa', 10);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (2, '22', 'bb', 20);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (3, '33', 'cc', 30);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (4, '44', 'dd', 40);
INSERT INTO `test`.`user` (`id`, `id_card`, `user_name`, `age`) VALUES (5, '55', 'ee', 50);
2 where语句及order的列 建立索引
表结构先不创建索引,我们看下执行分析
EXPLAIN SELECT * FROM user
WHERE user_name=“AA”;
EXPLAIN SELECT * FROM `user` WHERE user_name="AA";
执行成功, type=ALL表示没有索引,查询效率低下
我们在 user_name上建立索引后,再看下
#创建索引
alter table `user` add index `idx_name`(`user_name`);#执行分析
EXPLAIN SELECT * FROM `user` WHERE user_name="AA";
使用了索引,查询效率提升
3. where语句不要使用!=,<>
where语句中使用!= 或者 <>, 或者使用 between and 都会是引擎放弃索引,进行全表扫描
我们新建 age的索引,然后基于age去做查询分析
#创建age索引
alter table `user` add index `idx_age`(`age`);
#执行分析
EXPLAIN SELECT * FROM `user` WHERE age=10;
使用age索引进行查询,没有问题
现在我们使用 != 或者 <> 来进行查询,执行查询分析
EXPLAIN SELECT * FROM `user` WHERE age !=10;
EXPLAIN SELECT * FROM `user` WHERE age <>10;
EXPLAIN SELECT * FROM `user` WHERE age BETWEEN 10 and 20;
EXPLAIN SELECT * FROM `user` WHERE age > 10 and age < 20 ;
执行结果全都是 type=range 表示在索引范围内查找,对索引的扫描开始于某一点,返回匹配值域的行, 已经不是ref类型了,效率已经不高了
Extra 其他信息= using index condition 表示会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行;
using index condition = using index + 回表 + where 过滤
4.where语句不要or进行判断
where语句使用or判断,也会导致引擎放弃索引,进而进行全表扫描
使用 or, 也会造成 type=range的情况
EXPLAIN SELECT * FROM `user` WHERE age =10 or age =20;
这种情况,我们可以采用 union all 来进行优化
EXPLAIN SELECT * FROM `user` WHERE age =10 union all SELECT * FROM `user` WHERE age =20 ;
5.where语句不要使用 like模糊查询
like模糊查询,也会导致 全表扫描
#1.左侧开头精确匹配,右侧结果模糊
EXPLAIN SELECT * FROM `user` WHERE user_name like "a%";
#2.左侧开头模糊,右侧结果精确匹配
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a";
#3.左侧开头模糊,右侧结果模糊
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a%";
上面3种情况,我们来逐一分析
- 左侧开头精确匹配,右侧结果模糊, 查询会使用左侧索引进行匹配,type=range
EXPLAIN SELECT * FROM `user` WHERE user_name like "a%";
2. 左侧开头模糊,右侧结果精确匹配, 查询不会使用索引,全表扫描 type=ALL
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a";
3. 左侧开头模糊,右侧结果模糊, 查询不会使用索引,全表扫描 type=ALL
EXPLAIN SELECT * FROM `user` WHERE user_name like "%a%";
6.where语句 不要 in 和not in, 可能也会导致全表扫描
where子语句,使用 in,not in 也有可能导致全表扫描
所以使用in 到底走不走索引呢?
- in通常是走索引的
- IN 的条件过多,会导致索引失效,走索引扫描
- 当in后面的数据在数据表中超过一定的数量 (有人说是30%,假如上面的例子的全部数据大约100条,匹配数据超过30条 ),会走全表扫描,即不走索引
- in走不走索引和后面的数据有关系,这个比例不准
我表中5条数据, 我现在 in(10,20,30,40), in了4条,但是依旧走了索引 type=range, key=idx_age
EXPLAIN SELECT * FROM `user` WHERE age in(10,20,30,40);
我现在再加一个in条件 in(10,20,30,40,50), 此刻就没有走索引, type=ALL
EXPLAIN SELECT * FROM `user` WHERE age in(10,20,30,40,50);
但是 not in 是肯定不走索引的,这是我们明确禁止的
EXPLAIN SELECT * FROM `user` WHERE age not in(1,2);
7.where语句不要使用表达式计算及函数运算
where子句,不要使用表达式计算或者函数运算,这回导致全表扫描
EXPLAIN SELECT * FROM `user` WHERE age / 2 =10;
EXPLAIN SELECT * FROM `user` WHERE SUBSTRING(user_name,1,3)="aa";
执行结果全部都是 type=ALL,使用表达式计算和函数的 都不会使用索引
至此,我们了解如何去优化查询语句,在平时项目中,也应该多注意这些用法,防止出现线上事故
相关文章:

MSQL系列(六) Mysql实战-SQL语句优化
Mysql实战-SQL语句优化 前面我们讲解了索引的存储结构,BTree的索引结构,以及索引最左侧匹配原则,Explain的用法,可以看到是否使用了索引,今天我们讲解一下SQL语句的优化及如何优化 文章目录 Mysql实战-SQL语句优化1.…...

kaggle新赛:UBC卵巢癌亚型分类和异常检测大赛【图像分类】
赛题名称:UBC Ovarian Cancer Subtype Classification and Outlier Detection (UBC-OCEAN) 赛题链接:https://www.kaggle.com/competitions/UBC-OCEAN 赛题背景 卵巢癌是女性生殖系统最致命的癌症。目前,卵巢癌诊断依赖病理学家评估亚型。…...

基于nodejs+vue云旅青城系统
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
《孙哥说Spring5》笔记汇总
时隔两个多月,终于将《孙哥说Spring5》的笔记文章全部整理完了,在这里做个汇总。孙哥的Spring课讲的非常好,深度和广度都有所兼顾,推荐大家去看 点击学习《孙哥说Spring5》 基础铺垫 1️⃣ Spring5应用之基础扫盲2️⃣ Spring5应…...
在使用了spring-cloud-starter-gateway后,为什么还会发生cors问题
//1.需要配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.reactive.CorsWebFilter; import org.sp…...

CentOS7安装MySQL8.0.28
CentOS7安装MySQL8.0.28 一、下载MySQL安装包二、安装配置mysql 一、下载MySQL安装包 点击以下链接可以自动跳转:MySQL官网 接下来按如图所示依次点击进入。 选择自己所需要版本 此处如需下载历史版本可以点击 二、安装配置mysql 1、登录ssh或其他相关软件上…...

AutoSAR入门:应用背景及简介
1、应用背景 在我们现在的汽车行业里面,汽车电子的发展过程中,我们发现有一些新的趋势汽车电子系统的复杂性不断增长。 我们现在可以看到车辆有越来越多的功能,那么这些功能呢,也在往这个控制器上进行集中,比如说我们现…...

C++初阶(三)
文章目录 一、auto关键字(C11)1、auto简介2、auto使用规则1、 auto与指针和引用结合起来使用2、 在同一行定义多个变量 3、auto不能推导的场景1、 auto不能作为函数的参数2、 auto不能直接用来声明数组3、特性总结 二、基于范围的for循环(C11)1、范围for的语法2、 范围for的使用…...

PHP的学习入门建议
学习入门PHP的步骤如下: 确定学习PHP的目的和需求,例如是为了开发网站还是为了与数据库交互等。学习PHP的基础语法和程序结构,包括变量、数据类型、循环、条件等。学习PHP的面向对象编程(OOP)概念和技术。学习与MySQL…...

骰子涂色(Cube painting, UVa 253)rust解法
输入两个骰子,判断二者是否等价。每个骰子用6个字母表示,如图4-7所示。 例如rbgggr和rggbgr分别表示如图4-8所示的两个骰子。二者是等价的,因为图4-8(a)所示的骰子沿着竖直轴旋转90之后就可以得到图4-8(b&a…...

elasticsearch的docker安装与使用
安装 docker network create elasticdocker pull docker.elastic.co/elasticsearch/elasticsearch:8.10.4# 增加虚拟内存, 此处适用于linux vim /etc/sysctl.conf # 添加 vm.max_map_count262144 # 重新启动 sysctl vm.max_map_countdocker run --name es01 --net …...

ELK 单机安装
一丶软件下载 elasticsearch: https://www.elastic.co/downloads/past-releases kibana: https://www.elastic.co/downloads/past-releases 选择对应的版本的下载即可 二、es 安装es比较简单 rpm -ivh elasticsearch-2.4.2.rpm 修改配置文件 /etc/elasticsearch/elas…...

优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符
🥴博主:小猫娃来啦 🥴文章核心:优雅而高效的JavaScript——?? 运算符、?. 运算符和 ?. 运算符 文章目录 引言空值处理的挑战解决方案1:?? 运算符基本用法与 || 运算符的区别实际应用场景举例 解决方案2ÿ…...
Nginx配置负载均衡
Nginx配置负载均衡 使用nginx来配置负载均衡也是比较简单的 首先在http块中配置虚拟域名所对应的地址 # 负载均衡upstream myserver {server 127.0.0.1:8080;server 127.0.0.1:8082;}可以配置的参数有以下选项 #down 不参与负载均衡 #weight5; 权重,越高分配越多 #b…...
Ubuntu 20.04 上安装 neo4j
1. 进入要安装neo4j的ubuntu环境。 2. 添加Debian资源库。 Java 1.8.xx版本对应Neo4j 3.xx版本: (1)wget -O - https://debian.neo4j.com/neotechnology.gpg.key | sudo apt-key add - (2)echo deb https://debian.…...
大规模爬虫系统面临的主要挑战及解决思路
在构建大规模爬虫系统时,我们常常面临一系列挑战。这些挑战包括高效爬取、频率限制、分布式处理、存储和数据管理等方面。为了应对这些挑战,我们需要采取一些解决思路和策略。在本文中,我将与大家分享大规模爬虫系统面临的主要挑战以及解决思…...

统计学习方法 感知机
文章目录 统计学习方法 感知机模型定义学习策略学习算法原始算法对偶算法 学习算法的收敛性 统计学习方法 感知机 读李航的《统计机器学习》时,关于感知机的笔记。 感知机(perceptron)是一种二元分类的线性分类模型,属于判别模型…...
Linux命令(103)之wc
linux命令之wc 1.wc介绍 linux命令wc是用来统计文件的字数、行数和字节数 2.wc用法 wc [参数] [filename] wc参数 参数说明-l统计总行数,备注:常用于查看进程是否启动-L统计最长一行的字符数-c统计字节数-m统计字符数-w统计单词数 3.实例 3.1.统计…...

京东店铺公司名爬虫
内容仅供学习参考,如有侵权联系删除 先通过京东非自营的店铺名拿到的公司名,再通过公司名称去其他平台拿到联系方式(代码省略) from aioscrapy.spiders import Spider from aioscrapy.http import Request, FormRequest import dd…...
如何解决不同浏览器的样式兼容性问题?
目录 1. 理解浏览器差异: 2. 使用标准CSS属性和值: 3. CSS Reset 或 Normalize: 4. 使用浏览器引擎前缀: 5. 使用CSS兼容性工具: 6. 测试和调试: 7. 使用Polyfill: 8. 条件注释…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
起重机起升机构的安全装置有哪些?
起重机起升机构的安全装置是保障吊装作业安全的关键部件,主要用于防止超载、失控、断绳等危险情况。以下是常见的安全装置及其功能和原理: 一、超载保护装置(核心安全装置) 1. 起重量限制器 功能:实时监测起升载荷&a…...
第14节 Node.js 全局对象
JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。 在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局…...