工作中遇到的99%SQL优化,这里都能给你解决方案

2023-11-18

前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain。后台有些朋友说小强只介绍概念,平时使用还是一脸懵,强烈要求小强来一篇实战sql优化,经过周末两天的整理和总结,sql优化实战新鲜出炉, 大家平时学习和工作中,遇到的90% 的sql优化都会介绍到,介意篇幅过长,分成3篇文章哈。

CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='员工表';

insert into employees(name,age,position,hire_time) values('LiLei', 22, 'manager', NOW())
insert into employees(name,age,position,hire_time) values('HanMeimei', 23, 'dev', NOW())
insert into employees(name,age,position,hire_time) values('Lucy', 23, 'dev', NOW())

全值匹配

索引的字段类型是varchar(n):2字节存储字符串长度,如果是utf-8, 则长度是3n 2

EXPLAIN select * from employees where name='LiLei';

explain解析

EXPLAIN select * from employees where name='LiLei' AND age = 22;

explain解析

EXPLAIN select * from employees where name='LiLei' AND age = 22 AND position = 'manager';

explain解析

最左前缀法则

如果索引是多列,要最受最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。以下两条sql根据最左前缀法则,都不会走索引。

EXPLAIN select * from employees where age = 22 AND position='manager';
EXPLAIN select * from employees where position ='manager';

explain解析

索引失效

不要在索引列上做任何操作(计算、函数、类型转换),会导致索引失效而转向全表扫描。

EXPLAIN select * from employees where name='LiLei';

explain解析

EXPLAIN select * from employees where left(name, 3)='LiLei';

explain解析

给hire_time增加一个普通索引:

alter table `employees` ADD INDEX `idx_hire_time`(`hire_time`) USING BTREE;
EXPLAIN select * from employees where date(hire_time) = '2019-08-25';

explain解析

还原最初索引状态

ALTER TABLE `employees` DROP INDEX `idx_hire_time`;

存储引擎不能使用索引中范围条件右边的列

-- EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';
EXPLAIN SELECT * FROM employees WHERE name ='LiLei' AND age>22 AND position ='manager';

explain解析
看到key_len这个索引长度是78, 也就是只使用到了前两个字段name和age,postition没有使用到索引的。

覆盖索引

尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少selelct * 语句。

EXPLAIN SELECT name,age,position FROM employees WHERE name ='LiLei' AND age=22 AND position ='manager';

explain解析

条件判断

mysql在使用不等于(! = 或者 <>)的时候无法使用索引会导致全表扫描

EXPLAIN SELECT * FROM employees WHERE name !='LiLei' ;

explain解析

空值判断

is null,is not null也无法使用索引

EXPLAIN SELECT * FROM employees WHERE name is null;

explain解析

like

like以通配符开头(‘$abc’)mysql索引失效会变成全表扫描操作

EXPLAIN SELECT * FROM employees WHERE name LIKE '%Lei';

explain解析

字符串不加单引号索引失效

EXPLAIN SELECT * FROM employees WHERE name ='1000';
EXPLAIN SELECT * FROM employees WHERE name =1000;

explain解析
不加单引号的字符串,mysql底层会使用cust函数将其转换为字符串,此时索引失效。

or&in少使用

少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据索引比例、表大小等多个因素整体评估是否使用索引。

EXPLAIN SELECT * FROM employees WHERE name ='LiLei' or name='HanMeimei';

explain解析

范围查询优化

给年龄添加单值索引

ALTER TABLE `employees`ADD INDEX `idx_age`(`age`) USING BTREE;
EXPLAIN select * from employees where age > 1 and age <= 2000;

explain解析

没有走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。
这个例子没有走索引可能是因为单次数据量查询过大导致优化器最终选择不走索引。
优化方法:可以将大的范围拆分成多个小范围。

还没关注我的公众号?

  • 扫文末二维码关注公众号【小强的进阶之路】可领取如下:
  • 学习资料: 1T视频教程:涵盖Javaweb前后端教学视频、机器学习/人工智能教学视频、Linux系统教程视频、雅思考试视频教程;
  • 100多本书:包含C/C 、Java、Python三门编程语言的经典必看图书、LeetCode题解大全;
  • 软件工具:几乎包括你在编程道路上的可能会用到的大部分软件;
  • 项目源码:20个JavaWeb项目源码。
    小强的进阶之路二维码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

工作中遇到的99%SQL优化,这里都能给你解决方案 的相关文章

随机推荐

  • ADS1256驱动程序

    1 初始化 接口 SPI2 STM32 ADS1256 NSS PB12 CS SCK PB13 SCLK MISO PB14 DOUT MOSI PB15 DIN PB10 DRDY PB11 RESET
  • 感知机介绍及实现

    感知机 perceptron 由Rosenblatt于1957年提出 是神经网络与支持向量机的基础 感知机是最早被设计并被实现的人工神经网络 感知机是一种非常特殊的神经网络 它在人工神经网络的发展史上有着非常重要的地位 尽管它的能力非常有限
  • 错误ValueError: Buffer dtype mismatch, expected ‘float32_t‘ but got ‘double

    PCL库调用错误 cloud0 from array all pointcloud world File pcl pxi PointCloud PointXYZ 180 pxi line 160 in pcl pcl PointCloud
  • 一款强大的API接口文档管理工具(Smart-Doc + Torna)

    本文由龙飞同学供稿 在团队协作开发项目的时候 接口文档承担着向其他开发人员说明接口相关信息的重要任务 因此 一份清晰而又相近的接口文档至关重要 但是 写接口文档的痛苦想必各位开发人员都体验过 明明写接口的时候那么丝滑 写接口文档的时候像要老
  • linux 系统下执行R文件

    随着数据量的激增 在linux系统环境下执行数据分析模型显得很重要 本文来总结下在linux系统下执行R文件的步骤 step01 创建R脚本 例如 Rtest R step02 创建shell脚本 例如 runRtest sh 内容为 bi
  • 自由软件基金会公布了AGPL v3许可证

    自由软件基金会发布了一种新的开放源代码软件许可 新许可面向其代码被用作软件服务化 SaaS 应用的开发人员 新许可将确保对开放源代码SaaS应用代码的修改会反馈给自由软件社区 新许可名称为GNU Affero General Public
  • CCF-CSP-202109-4-收集卡牌

    原题链接 满分代码 include
  • eplan怎样创建和修改图框_EPLAN标题页及图框的设计

    标题页理解为特殊的表格 选择 工具 主数据 表格 打开 弹出 打开表格 对话框 文件类型 标题页 封页 f26 选择需要打开的表格 点击打开按钮 表格中的元素 1 文本 表示普通的 固定的文字 2 特殊文本 表达项目属性 页或表格属性的值
  • oracle 分表

    项目中操作日志因为数据量过大所以做分表操作 MYBATIES 创建表
  • .Net项目github接入sonarcloud

    代码质量方面的检测工具 在这之前从来没用过 就算前阵子听说了sonarcloud 也仅当知道记录了下 结果昨天被某些事情刺激了下 于是去查了下资料 然后就顺便在github上做了下测试 这里做个记录 sonarcloud的官网地址是http
  • JUC并发编程狂神说笔记(超详细)

    JUC 环境准备 线程和进程 wait与sleep的区别 lock锁 重点 传统的Synchronized锁 Lock锁 接口 Sychronized和lock的区别 锁是什么 如何判断锁的是谁 生产者和消费者的问题 Sychronized
  • docker-swarm 节点增加、删除、权限提升、降低、服务部署、配置可视化界面、stack等一系列操作

    一 部署环境准备 系统版本 centos 7 8 docker swarm 至少需要三个节点 所以需要准备三台机器 本文使用虚拟机 虚拟三台 centos机器 配置如下 节点信息 修改主机名 hostnamectl set hostname
  • 1、嵌入式linux

    嵌入式linux linux 2 应用程序设计 1 创建文件 2 文件描述 3 系统调用 打开 linux 你好 2 应用程序设计 系统调用方式访问文件 1 创建文件 使用的是 creat的系统调用方式 创建一个file creat c的文
  • 【交通运输与新基建(三)】交通基础设施数字化智能化发展

    目录 新技术推动交通系统数字化智能化发展 数字交通 新基建下数字交通助力提升道路安全主动干预及应急反应能力 挑战 展望 新技术推动交通系统数字化智能化发展 互联网 的发展 推进了人获得精准 便利 预约 共享 个性化 一体化的服务 自动驾驶技
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • BigInteger和BigDecimal有什么区别?

    BigInteger和BigDecimal都是Java中用来处理大数的类 主要区别在于它们的用途不同 BigInteger适用于处理大整数 即整数位数大于long类型的最大值9223372036854775807的情况 BigInteger
  • 如何将个人 NAS 里的 Stable Diffusion 模型库挂载到 PAI-EAS

    通过在线迁移服务 您已经将SD公共模型库的模型文件转存到了自己的NAS文件目录中 该存储空间中的模型可以被用于SDWebUI 另外也可以将未来训练和推理的结果保存到该NAS目录中 您可以通过如下文件挂载方式来实现 1 前往文件存储NAS控制
  • java 常见判断题

    1 根据下面的代码 String s null 会抛出NullPointerException异常的有 if s null s length gt 0 if s null s length gt 0 if s null s length 0
  • 微信接口CSDN博客

    http blog csdn net xiong it article details 45174207
  • 工作中遇到的99%SQL优化,这里都能给你解决方案

    前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain 后台有些朋友说小强只介绍概念 平时使用还是一脸懵 强烈要求小强来一篇实战sql优化 经过周末两天的整理和总结 sql优化实战新鲜出炉 大家平时学习和工作中 遇到的