Mysql sql优化

目录

目的

目标

explain

优化

避免使用select *

用union all代替union

小表驱动大表(in与exists)

批量操作

多使用limit

in中值太多

不使用%前缀模糊查询

不在where子句中进行表达式操作

避免隐式类型转换

联合索引遵守最左前缀法则

inner join、left join、right join、full join

count(*)与count(1)

避免is null /is not null

避免在 where 子句中使用 or

去重distinct过滤字段要少


目的

        1.提高资源的利用率

        2.提高系统的吞吐量

        3.同时满足更多用户的在线需求

目标

        1.减少磁盘IO

        2.减少网络带宽

        3.降低cpu消耗

explain

        在select语句之前增加explain关键字,执行后MySQL就会返回执行计划的信息,而不是执行sql。但如果from中包含子查询,MySQL仍会执行该子查询,并把子查询的结果放入临时表中。

EXPLAIN SELECT
    tp.*, col.course_title couserName,
    col.course_type_name courseName,
    col.course_theme_name courseTheme,
    col.course_type_name courseType
FROM
    le_teaching_plan tp
JOIN le_course col ON tp.course_id = col.id
WHERE
    tp.id = '0293abd864954d4b93f163e473924032'

1.id:id列的编号是select的序列号,有几个select就有几个id

2.select_type:

        simple:不包含子查询和union的简单查询

        primary:复杂查询中最外层的select

        subquery:包含在select中的子查询

        derived:包含在from子句中的子查询

        union:在union中的第二个和随后的select,UNION RESULT为合并的结果

3.table:表示当前行访问的是哪张表

4.partitions:查询将匹配记录的分区,对于非分区表为null

5.type:此列表示关联类型或访问类型。也就是MySQL决定如何查找表中的行。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all

6.possible_keys:此列显示在查询中可能用到的索引

7.key:此列显示MySQL在查询时实际用到的索引

8.key_len:索引里使用的字节数

9.ref:显示key列记录的索引中,表查找值时使用到的列或常量

10.rows:查询中估计要读取的行数

11.Extra:额外信息

优化

避免使用select *

        使用*号多查出来的数据,通过网络IO传输的过程中,也会增加数据传输的时间;同时*不走覆盖索引,导致性能降低。

        通过索引值可以直接找到要查询字段的值,而不需要通过主键值回表查询,那么就叫覆盖索引。

用union all代替union

(select * from user where id=1)
union
(select * from user where id=2);

        使用union关键字后,可以获取排重后的数据(排重的过程需要遍历、排序和比较,它更耗时,更消耗cpu资源)

        使用union all关键字,可以获取所有数据,包含重复的数据

小表驱动大表(in与exists)

        用小表的数据集驱动大表的数据集

select * from order
where user_id in (select id from user where status=1)

select * from order
where exists (select 1 from user where order.user_id = user.id and status=1)

sql语句中包含了in关键字,则它会优先执行in里面的子查询语句,然后再执行in外面的语句。

sql语句中包含了exists关键字,它优先执行exists左边的语句(即主查询语句)。然后把它作为条件,去跟右边的语句匹配。如果匹配上,则可以查询出数据。如果匹配不上,数据就被过滤掉了。

in 适用于左边大表,右边小表;exists 适用于左边小表,右边大表。

批量操作

        尽量只远程请求一次数据库,sql性能会得到提升,数据量越多,提升越大;需要注意的是,不建议一次批量操作太多的数据,如果数据太多数据库响应也会很慢。批量操作需要把握一个度,建议每批数据尽量控制在500以内。如果数据多于500,则分多批次处理

多使用limit

为了使explain中type列达到const类型。当只需要一条数据的时候,使用limit 1,如果加上limit1,查找到就不用继续往后找了

in中值太多

select id,name from category
where id in (1,2,3...100000000);

不使用%前缀模糊查询

select * from order where name like '%name%'

使用%前缀会导致索引失效而进行全表扫描;

如果需要使用%name%,可以使用全文索引

创建全文索引

alter table order add fulltest index `idx_name` (`name`);

使用全文索引

select * from order where match(name) against('zhangsan')

不在where子句中进行表达式操作

select user_id,user_project from user_base where age*2=36;

字段就行了算术运算,这会造成引擎放弃使用索引

避免隐式类型转换

        where子句中出现name字段的类型和传入的参数类型不一致的时候发生的类型转换,会导致索引失效

联合索引遵守最左前缀法则

        如含有字段id、name、school,可以直接用id字段,也可以id、name这样的顺序,但是name;school都无法使用这个索引。

        联合索引存在范围查询,比如between、>、<等条件时,会造成后面的索引字段失效

inner join、left join、right join、full join

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 

right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录

inner join(内连接) 返回两个表中联结字段相等的行

full join(全连接)返回两个表中没有相等的行

count(*)与count(1)

如果表中多个列并且没有主键,则count(1)的执行效率优于count(*);

如果有主键,则select count(主键)的执行效率是最优的;如果表中只有一个字段,则select count(*)最优。

避免is null /is not null

select id from t where num is null

        尽量避免在 where 子句中对字段进行 null 值判断,使用is null 或者is not null 理论上都会走索引,存在Null值会导致mysql优化器处理起来比较复杂,容易导致引擎放弃使用索引而进行全表扫描

null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null

避免在 where 子句中使用 or

select id from t where num=10 or num=20

改为:

select id from t where num=10
union all
select id from t where num=20

        where 子句中使用 or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描;如果要利用索引,则OR之间的每个条件列都必须要用到索引。

去重distinct过滤字段要少

当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较、过滤的过程会占用系统资源,如cpu时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/14994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring Boot 源码学习】走近 AutoConfigurationImportSelector

AutoConfigurationImportSelector 源码解析 引言主要内容1. ImportSelector 接口2. DeferredImportSelector 接口3. AutoConfigurationImportSelector 功能概述 总结 引言 上篇博文我们了解了 EnableAutoConfiguration 注解&#xff0c;其中真正实现自动配置功能的核心实现者 …

细讲TCP三次握手四次挥手(二)

TCP/IP 协议族 应用层 应用层( application-layer &#xff09;的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程&#xff08;进程&#xff1a;主机中正在运行的程序&#xff09;间的通信和交互的规则。 对于不同的网络应用需要不同的应用层协议…

C语言字串函数、内存函数介绍以及模拟实现

目录 前言 本期内容介绍&#xff1a; 一、字符串函数 strlen介绍 strlen 模拟实现&#xff08;三种方式&#xff09; 方法一&#xff1a;计数器法 方法二&#xff1a;递归法&#xff08;不创建临时变量法&#xff09; 方法三&#xff1a;指针-指针 strcpy介绍 strcpy模…

速度快\颜色准\功能多,移动端HEIF图片解码实现方案

HEIF图片压缩格式是一种使用HEVC编码技术存储图像数据的方式&#xff0c;在同等质量下相比JPEG可节省50%以上空间&#xff0c;无论是节约包体还是节省带宽&#xff0c;使用HEIF格式都能有所收益。 基于百度智能云音视频处理MCP的自研BD265编码器&#xff0c;百度智能云对象存储…

合并两个有序数组——力扣88

文章目录 题目描述法一 双指针法二 逆向双指针 题目描述 法一 双指针 使用双指针方法&#xff0c;将两个数组看作队列&#xff0c;每次从两个数组头部取出比较小的数字放到结果中。 void merge(vector<int>&nums1, int m,vector<int>&nums2, int n){int p1…

C++ ——STL容器【list】模拟实现

代码仓库&#xff1a; list模拟实现 list源码 数据结构——双向链表 文章目录 &#x1f347;1. 节点结构体&#x1f348;2. list成员&#x1f349;3. 迭代器模板&#x1f34a;4. 迭代器&#x1f34b;5. 插入删除操作&#x1f34c;5.1 insert & erase&#x1f34c;5.2 push_…

15 文本编辑器vim

15.1 建立文件命令 如果file.txt就是修改这个文件&#xff0c;如果不存在就是新建一个文件。 vim file.txt 使用vim建完文件后&#xff0c;会自动进入文件中。 15.2 切换模式 底部要是显示插入&#xff0c;是编辑模式&#xff1b; 按esc&#xff0c;底部要是空白的&#xff0…

微服务契约测试框架Pact-Python实战

Pact是一个契约测试框架&#xff0c;有多种语言实现&#xff0c;本文以基于pact-python探究契约测试到底是什么&#xff1f;以及如何实现 官网&#xff1a;自述文件 |契约文档 (pact.io) 契约测试步骤 1、为消费者写一个单元测试&#xff0c;让它通过&#xff0c;并生成契约…

OS-08-事件驱动:C10M是如何实现的?

08-事件驱动&#xff1a;C10M是如何实现的&#xff1f; 你好&#xff0c;我是陶辉。 上一讲介绍了广播与组播这种一对多通讯方式&#xff0c;从这一讲开始&#xff0c;我们回到主流的一对一通讯方式。 早些年我们谈到高并发&#xff0c;总是会提到C10K&#xff0c;这是指服务…

MIT 6.830数据库系统 -- lab five

MIT 6.830数据库系统 -- lab five 项目拉取引言搜索练习1 BTreeFile.findLeafPage() 插入练习2 Spliting Page 删除练习3 页再分配练习4 合并页 事务小结 项目拉取 原项目使用ant进行项目构建&#xff0c;我已经更改为Maven构建&#xff0c;大家直接拉取我改好后的项目即可: …

Zookeeper入门介绍

Zookeeper在我本次系统的学习之前是已经开始使用了&#xff0c;但是并不理解Zookeeper到底是什么&#xff0c;有什么作用&#xff0c;你或许跟我有一样的疑惑&#xff0c;本专栏将会解决这些疑惑。 目录 Zookeeper介绍&#xff1a; zookeeper特点&#xff1a; 数据结构&#x…

《MySQL 实战 45 讲》课程学习笔记(二)

日志系统&#xff1a;一条 SQL 更新语句是如何执行的&#xff1f; 与查询流程不一样的是&#xff0c;更新流程还涉及两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff09;和 binlog&#xff08;归档日志&#xff09;。 重要的日志模块&#xff1a;redo l…

【VSCode部署模型】导出TensorFlow2.X训练好的模型信息

参考tensorflow2.0 C加载python训练保存的pb模型 经过模型训练及保存&#xff0c;我们得到“OptimalModelDataSet2”文件夹&#xff0c;模型的保存方法(.h5或.pb文件)&#xff0c;参考【Visual Studio Code】c/c部署tensorflow训练的模型 其中“OptimalModelDataSet2”文件夹保…

Doris安装部署入门

文章目录 一 Doris 介绍1.1 使用场景1.1.2 Doris架构 二 Doris单机部署2.1 下载 Doris2.2 配置 Doris2.2.1 配置 FE2.2.2 启动 FE2.2.3 查看 FE 运行状态2.2.4 连接 FE2.2.5 停止 FE 节点2.2.6 配置 BE2.2.7 启动 BE2.2.8 添加 BE 节点到集群2.2.9 查看 BE 运行状态2.2.10 停止…

GitHub仓库如何使用

核心&#xff1a;GitHub仓库如何使用 目录 1.创建仓库&#xff1a; 2.克隆仓库到本地&#xff1a; 3.添加、提交和推送更改&#xff1a; 4.分支管理&#xff1a; 5.拉取请求&#xff08;Pull Requests&#xff09;&#xff1a; 6.合并代码&#xff1a; 7.其他功能&…

网络知识整理

网络知识整理 网络拓扑网关默认网关 数据传输拓扑结构层面协议层面 网络拓扑 网关 连接两个不同的网络的设备都可以叫网关设备&#xff0c;网关的作用就是实现两个网络之间进行通讯与控制。 网关设备可以是交换机(三层及以上才能跨网络) 、路由器、启用了路由协议的服务器、代…

k8s Webhook 使用java springboot实现webhook 学习总结

k8s Webhook 使用java springboot实现webhook 学习总结 大纲 基础概念准入控制器&#xff08;Admission Controllers&#xff09;ValidatingWebhookConfiguration 与 MutatingWebhookConfiguration准入检查&#xff08;AdmissionReview&#xff09;使用Springboot实现k8s-Web…

Linux 学习记录57(ARM篇)

Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…

【kubernetes系列】flannel之vxlan模式原理

概述 在Kubernetes中要保证容器之间网络互通&#xff0c;网络至关重要。而Kubernetes本身并没有自己实现容器网络&#xff0c;而是而是借助CNI标准&#xff0c;通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则&#xff1a; Pod无论运行在任何节点都可…

九、HAL_IWDG独立看门狗的使用

1、开发环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 2、IWDG简介 (1)IWDG即独立看门狗。 (2)看门狗本质上是一个定时器&#xff0c;设置一个时间&#xff0c;时间到即让程序复位。所以需要在在时间未到之前重置定时器&#xff0c;也就是喂…