当前位置: 首页 > news >正文

慢查询sql索引优化

模拟大量数据表、脚本

explain执行计划属性含义

1,id值越大越先执行,id相同顺序执行
2,select_type:simple、primary、subquery、derived衍生、union、union result

select_type含义sql
simple简单的select查询,查询中不包含子查询或者unionexplain select * from employees join dept_emp on employees.emp_no= dept_emp.emp_no where employees.emp_no=10;
primary子查询中,最外层的查询explain SELECT * FROM employees WHERE employees.emp_no = (SELECT MAX(emp_no) FROM employees);
subquery子查询explain SELECT * FROM employees WHERE employees.emp_no = (SELECT MAX(emp_no) FROM employees);
derivedfrom列表中包含了子查询,mysql会递归执行这些子查询,把结果放在临时表中explain select * from employees join (SELECT MAX(emp_no) t1 FROM employees) temp on employees.emp_no= temp.t1;
union查询中包含union表示并集并且去重,union all不去重explain select * from employees where first_name = ‘xyz’ union select * from employees where last_name = ‘xyz’;
union resultunion去重结果explain select * from employees where first_name = ‘xyz’ union select * from employees where last_name = ‘xyz’;

3,type访问类型

type含义举例
nullmysql不访问任何表,索引,直接返回结果explain select now();
system系统表,少量数据,不需要磁盘io,mysql5.7显示all
const命中主键primary key或者唯一unique索引;被连接部分是一个常量const值explain select * from employees where emp_no=3;
eq_ref前表的每一行,后表只有一行被扫描。1join查询,2命中主键或非空唯一索引,3等值连接explain select * from dept,emp where emp.id=dept.id;
ref非唯一性索引扫描,返回匹配某个单独值的所有行。
rangewhere之后出现between,<,>,in等操作explain select * from employees where emp_no<=3;
index需要扫描索引上全部数据。explain select emp_no,first_name from employees;
all全表扫描

4,extra额外的执行信息

extra含义举例
using filesort排序字段为非索引字段,或者组合索引中非左索引倒序explain select emp_no,first_name from employees order by birth_date desc;
using temporary需要建立临时表暂存中间结果,常见于order by和group byexplain select count(*),last_name from employees group by last_name;
using index二级索引字段和主键满足查询要求,不需要回表,效率好explain select count(*),first_name from employees group by first_name;

show profiles

MySQL提供可以用来分析当前会话中SQL语句执行的资源消耗情况。
MySQL调优–03—show profiles 和 show processlist

索引优化

1,组合索引
1.1,组合索引,只要字段匹配成功即可,与字段顺序无关
1.2,组合索引,最左匹配
1.3,组合索引中,非最左字段使用范围查询,会导致组合索引中范围字段后边的所有字段索引不生效。

2,不要在索引列上进行运算操作,索引将失效

explain select * from table where substring(name,3,2)='科技'

3,字符串不加单引号,导致索引失效。因为mysql优化器会进行类型转换
4,尽量使用覆盖索引,避免select *,会导致回表
5,or前后需要都使用索引,引起索引合并,索引才能生效。如果一侧使用索引会导致索引失效。多表查询中哪怕or两边都带有索引也会导致索引失效。遇到or尽量用union或者union all代替。
6,以%开头的like模糊查询,导致索引失效。
7,索引列数值重复概率大,mysql以为使用索引比全表扫描慢,会不使用索引。
8,is null或者is not null会根据值null或者非null比例判断是否值得使用索引。
9,普通索引中,in走索引,not in索引失效。主键索引in和not in都走索引。
10,多个普通索引字段,只会生效一个,其他索引会失效。如果条件中包含几个字段,尽量使用组合索引。

sql优化

order by优化:

1,查询字段尽量使用索引字段和主键,减少回表。
2,order by排序字段有多个时,尽量要么同时递增,要么同时递减。
3,排序前后顺序尽量和组合索引字段顺序一致。
4,如果必须使用到filesort时,max_length_for_sort_data大小和query语句取出的字段总大小,来判断一次扫描还是两次扫描,可以适当提高sort_buffer_size和max_length_for_sort_data系统变量,来增大排序区的大小,提高排序效率。

子查询优化:

子查询会生成临时表,效率低于连接join查询。

limit优化:

比如 limit 100000,10,mysql需要排序前100010记录,仅仅返回最后10条记录,其他记录丢弃,查询排序代价非常大。
方式1:索引上完成排序分页操作,最后根据主键关联回原表所需要的其他列数据。

select * from employees join(select emp_no from employees
where first_name like 'x%' order by birth_date desc
limit 100000,10) as tempwhere employees.emp_no=temp.emp_no;

方式2:只适用于主键自增。

select * from employees
where first_name like 'x%' and emp_no>100000 order by emp_no asc
limit 10;

sql优化 涉及到索引失效和慢查询

对慢查询的优化:
在业务系统中,除了使用主键进行的查询,其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们.
慢查询的优化首先要搞明白慢的原因是什么? 是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?
所以优化也是针对这三个方向来的,
首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写.
MySQL提供了explain命令来查看语句的执行计划,MySQL在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多信息. 可以通过其中和索引有关的信息来分析是否命中了索引,例如possilbe_key,key,key_len等字段,分别说明了此语句可能会使用的索引,实际使用的索引以及使用的索引长度.分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引.
如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Docker:基础概念、架构与网络模式详解
  • Linux先行一步
  • java通过pdf-box插件完成对pdf文件中图片/文字的替换
  • 鸿蒙Navigation路由能力汇总
  • 自动化测试高级控件交互方法:TouchAction、触屏操作、点按,双击,滑动,手势解锁!
  • 编程的法则 迪米特法则(Law of Demeter)也称为“最少知识原则(Principle of Least Knowledge)包括如何实践
  • 微服务之间Feign调用
  • mac M1 创建Mysql8.0容器
  • C# Blazor Server与JS互操作无法获取大数据量返回值
  • 2024-07-13 Unity AI状态机2 —— 项目介绍
  • Dify中的高质量索引模式实现过程
  • 华为USG6000V防火墙NAT智能选举
  • Python和C++行人轨迹预推算和空间机器人多传感融合双图算法模型
  • 字节码编程之bytebuddy结合javaagent支持多种监控方式
  • 【Spring全家桶系列之核心篇 | Spring Cloud】 - 第七章 掌握Gateway核心技术,实现高效路由与转发
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • DOM的那些事
  • Iterator 和 for...of 循环
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • passportjs 源码分析
  • Python socket服务器端、客户端传送信息
  • Swoft 源码剖析 - 代码自动更新机制
  • tensorflow学习笔记3——MNIST应用篇
  • 番外篇1:在Windows环境下安装JDK
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 高性能JavaScript阅读简记(三)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用简单代码看卷积组块发展
  • 栈实现走出迷宫(C++)
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #etcd#安装时出错
  • #git 撤消对文件的更改
  • #知识分享#笔记#学习方法
  • (09)Hive——CTE 公共表达式
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)c52学习之旅-静态数码管
  • (一)UDP基本编程步骤
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net多线程Threading相关详解
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET连接数据库方式
  • .NET中winform传递参数至Url并获得返回值或文件
  • .NET中两种OCR方式对比
  • @javax.ws.rs Webservice注解
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • [ 第一章] JavaScript 简史
  • [] 与 [[]], -gt 与 > 的比较