首页 > 数据库 >MySQL SQL点查,范围查,排序,分组的Explain分析和SQL优化(8.0版本)

MySQL SQL点查,范围查,排序,分组的Explain分析和SQL优化(8.0版本)

时间:2024-01-25 19:32:11浏览次数:40  
标签:8.0 Explain t1 索引 SQL c3 c2 c1 SELECT

MySQL SQL常用优化主要有where,range,order,group by,or等查询。下图是优化的原则,后面会有一个例子来看看:

image.png

比如建立了联合索引(c1,c2,c3),索引长度分别为5,5,4。数据有50条:

点查

SELECT * FROM training.t1 where c3 =1 and c2=1 and c1=1 ;

使用了索引,只要全部包含索引列,那么点查顺序无所谓,索引长度为14: image.png

SELECT * FROM training.t1 where c2=1 and c1=1 ;

使用了索引,只要包含了首列c1,c1和c2顺序无所谓,索引长度为10: image.png

SELECT * FROM training.t1 where c3=1 and c1=1 ;

使用了索引,但是索引条件下推了,只要包含了首列,跨列顺序无所谓,会使用索引下推,但是c3无法走索引,索引长度是5,只用了c1字断索引: image.png

SELECT * FROM training.t1 where c2=1 and c3=1;

不包含首列c1,那么会索引失效,走全部扫描: image.png

范围查询

SELECT * FROM t1 where c3>1 and c1>1 and c2>1;

只有c1用到了索引,c2,c3没用到索引,索引长度是5,可以看出范围查询很简单,只要一列用了范围查询,后面的列都不会走索引,但是会走索引下推:

image.png

SELECT * FROM t1 where c3>1 and c2>1;

没有c1,会直接全部扫描: image.png

SELECT * FROM t1 where c1=1 and c2>1 and c3=1;

用到了索引字段c1,c2。c3字段无法使用索引,索引长度是10,c3列走了索引下推优化: image.png

排序

排序优先索引排序,这就要求查询和排序字段都必须要order by子句中:

SELECT c1,c2,c3 FROM t1 order by c1; SELECT c1,c2,c3 FROM t1 order by c1,c2; SELECT c1,c2,c3 FROM t1 order by c1,c2,c3; SELECT c1,c2,c3 FROM t1 where c1=1 order by c2,c3; SELECT c1,c2,c3 FROM t1 where c1>1 order by c1,c2,c3;

以上都利用了索引排序。 image.png

SELECT c1,c2,c3,c4 FROM t1 order by c1,c2,c3;

由于查询列不包括索引字段,所以使用了文件排序: image.png

SELECT c1,c2,c3 FROM t1 order by c1 asc,c2 desc

排序的方向不一样,使用了文件排序: image.png

SELECT c1,c2,c3 FROM t1 where c1=2 order by c1 asc,c2 desc

排序方向不一样,出现了backward index scan(反向索引扫描) image.png

SELECT c1,c2,c3 FROM t1 order by c1 asc,c4 asc

排序不在索引的列,会导致filesort: image.png

SELECT c1,c2,c3 FROM t1 where c1>2 order by c2,c3

索引列第一个是范围查询,排序使用后面索引会导致filesort: image.png

参考

where优化:https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html range优化:https://dev.mysql.com/doc/refman/8.0/en/range-optimization.html 排序优化:https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html 分组优化:https://dev.mysql.com/doc/refman/8.0/en/group-by-optimization.html

标签:8.0,Explain,t1,索引,SQL,c3,c2,c1,SELECT
From: https://blog.51cto.com/thinklili/9417980

相关文章

  • [原创]Windows安装配置PostgreSql_15.5.1数据库
    [原创]Windows安装配置PostgreSql_15.5.1数据库   PostgreSql数据库有多种安装方式,windows上常用的是installer方式、binary手动安装方式,本文采用手动安装的方式处理。总体过程比较简单,有mysql配置经验的分分钟的事儿。    一、下载并解压文件到具体安装目录。 ......
  • SQL--数据查询语句DQL
    DQL--语句DQL-介绍DQL英文全称是DataQueryLanguage(数据查询语句),用来查询数据库表中的记录。DQL-语法//编写顺序SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT分页参数......
  • sqlmap过滤连续空格的方法
    一、指定脚本tamper=space2comment是SQLMAP的一个参数,用于指定使用space2comment.py脚本进行注入测试时的数据处理方式。具体来说,space2comment.py脚本的作用是将SQLMAP检测目标时所使用的payload中的空格全部替换成注释。通过使用这个参数,可以增加注入测试的成功率。范例:<<引用:–......
  • SQLServer查询历史执行记录的方法实现
    1.使用SQLServerManagementStudio(SSMS)的查询执行记录功能:打开SSMS,连接到要查看执行记录的数据库服务器。在“对象资源管理器”窗格中,右键单击要查看执行记录的数据库,然后选择“报表”>“标准报表”>“执行记录”。在“执行记录”窗口中,选择要查看的时间范围和其他......
  • MySQL学习笔记-d1
    壹·基础篇通用语法及分类DDL:数据定义语言,用来定义数据库对象(数据库、表、字段)DML:数据操作语言,用来对数据库表中的数据进行增删改DQL:数据查询语言,用来查询数据库中表的记录DCL:数据控制语言,用来创建数据库用户、控制数据库的控制权限DDL:1.1数据库CREATEDATABASE......
  • Mysql在Linux运行时新增配置文件提示:World-wrirable config file '/etc/mysql/conf.d/
    场景docker-compose入门以及部署SpringBoot+Vue+Redis+Mysql(前后端分离项目)以若依前后端分离版为例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128372122在Centos服务器上使用docker-compose部署mysql后,未配置数据卷映射的my.cnf配置文件。再将服务全部dow......
  • [转帖]一文搞懂各种数据库SQL执行计划:MySQL、Oracle等
    https://zhuanlan.zhihu.com/p/99331255 14人赞同了该文章MySQL执行计划Oracle执行计划SQLServer执行计划PostgreSQL执行计划执行计划(executionplan,也叫查询计划或者解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连......
  • MySQL所有常用语法大全
    MySQL所有常用语法大全一、常用操作数据库的命令1.showdatabases;查看所有的数据库2.createdatabasetest;创建一个叫test的数据库3.dropdatabasetest;删除一个叫test的数据库4.usetest;选中库,在建表之前必须要选择数据库5.showtables;在选中的数据库之中查看所......
  • MySQL100题知识点
    https://testerhome.com/articles/349721、select*查询带来的不确定性2、SELECTemp_name,salary*12+COALESCE(bonus,0)FROMemployee;COALESCE函数用于将空值转换为03、SELECTemp_name,salary*12+COALESCE(bonus,0)AS"全年收入"FROMemployee;AS为......
  • PL/SQL基础知识(转)
    PL/SQL这是对Oracle-SQL知识点详细介绍的文章系列,其他文章如下:Oracle-SQL系列知识点(一)Oracle-SQL系列知识点(二)Oracle-SQL系列知识点(三)PL/SQL基础知识什么是PL/SQL?PL/SQL是由Oracle开发,专用于Oracle的一种程序设计语言;PL代表ProceduralLanguage;SQL代表Stru......