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时间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

平衡二叉树介绍

一、树的概念 1.1 空树和非空树 空树&#xff1a;结点数为0的树 非空树&#xff1a;有且仅有一个根节点。其中&#xff0c;没有后继的结点叫叶子结点&#xff0c;有后继的结点叫做分支结点。 如下图所示&#xff1a; 1.2树的属性 除了根结点外任何一个结点都有且仅有一个前…

【黑马头条之图片识别文字审核敏感词】

本笔记内容为黑马头条项目的图片识别文字审核敏感词部分 目录 一、需求分析 二、图片文字识别 三、Tess4j案例 四、管理敏感词和图片文字识别集成到文章审核 一、需求分析 产品经理召集开会&#xff0c;文章审核功能已经交付了&#xff0c;文章也能正常发布审核。对于上次…

组件间嵌套与父子组件通信

1.组件的嵌套 比如在App.vue内使用注册的ShowInfo组件,这就是组件嵌套,其中ShowInfo是子组件,App是父组件 ◼ 前面我们是将所有的逻辑放到一个App.vue中&#xff1a;  在之前的案例中&#xff0c;我们只是创建了一个组件App&#xff1b;  如果我们一个应用程序将所有的逻…

Ansible自动化运维学习——综合练习

目录 (一)练习一 1.新建一个role——app 2.创建文件 3.删除之前安装的httpd服务和apache用户 4.准备tasks任务 (1)创建组group.yml (2)创建用户user.yml (3)安装程序yum.yml (4)修改模板httpd.conf.j2 (5)编写templ.yml (6)编写start.yml (7)编写copyfile.yml (8…

TEE GP(Global Platform)技术委员会及中国任务小组

TEE之GP(Global Platform)认证汇总 一、TEE GP技术委员会 二、GP中国任务小组 参考&#xff1a; GlobalPlatform Certification - GlobalPlatform

基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章

最近在整理和编写基于C#的WinForm应用程序&#xff0c;然后碰到一个其他读者也可能碰到的问题&#xff0c;就是C#的Borderless无边框窗体的动画效果问题。 在Visual Studio 2022里&#xff0c;C#的WinForm程序提供了Borderless无边框窗体的样式效果&#xff0c;但是它没提供在无…

用QFramework来重构 祖玛游戏

资料 Unity - 祖玛游戏 GitHub 说明 用QF一个场景就够了&#xff0c;在UIRoot下切换预制体达到面板切换。 但测试中当然要有一个直接跳到测试面板的 测试脚本&#xff0c;保留测试Scene&#xff08;不然初学者也不知道怎么恢复测试Scene&#xff09;&#xff0c;所以全文按S…

经营在线业务的首选客服工具--SS客服

随着网购正在快速取代传统零售业&#xff0c;各行各业的企业都在大力发展电子商务以取悦客户。但是&#xff0c;有这么多可用的电子商务平台&#xff0c;选择一款符合自己发展的平台确实不容易。电子商务平台不仅是企业在线销售产品和服务的地方&#xff0c;也是他们管理日常运…

按键消抖实现

一、使用状态机实现按键消抖 可将按键按下整个过程看做四个状态&#xff1a;按键空闲状态&#xff0c;按下抖动状态&#xff0c;稳定按下状态&#xff0c;释放抖动状态。 代码实现&#xff1a; /** Description: 状态机方式按键消抖(多按键)* Author: Fu Yu* Date: 2023-07-27…

听GPT 讲K8s源代码--pkg(八)

k8s项目中 pkg/kubelet/envvars&#xff0c;pkg/kubelet/events&#xff0c;pkg/kubelet/eviction&#xff0c;pkg/kubelet/images&#xff0c;pkg/kubelet/kubeletconfig这些目录都是 kubelet 组件的不同功能模块所在的代码目录。 pkg/kubelet/envvars 目录中包含了与容器运行…

服务器用友数据库中了locked勒索病毒后怎么解锁数据恢复

随着信息技术的迅速发展&#xff0c;服务器成为现代企业中不可或缺的重要设备。然而&#xff0c;由于网络安全风险的存在&#xff0c;服务器在日常运作中可能遭受各种威胁&#xff0c;包括恶意软件和勒索病毒攻击。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的用…

Jenkins+Gitlab+Maven集成CI/CD

MavenGitlab集成 配置好下列环境 # Java环境 JAVA_HOME /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64# Maven环境 MAVEN_HOME /usr/local/maven# Maven环境变量 PATHEXTRA $MAVEN_HOME/bin1. 配置settings.xml路径 2. 安装maven插件 创建项目 配置gitlab地址和指…

19.2:纸牌问题

给定一个整型数组arr&#xff0c;代表数值不同的纸牌排成一条线 玩家A和玩家B依次拿走每张纸牌 规定玩家A先拿&#xff0c;玩家B后拿 但是每个玩家每次只能拿走最左或最右的纸牌 玩家A和玩家B都绝顶聪明 请返回最后获胜者的分数 方法一&#xff1a;暴力解法 自然智慧。 pack…

Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于解析法和遗传算法相结合的配电网多台分布式电源降损配置(Matlab实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

1200*B. Vanya and Lanterns

Examples input 7 15 15 5 3 7 9 14 0 output 2.5000000000 input 2 5 2 5 output 2.0000000000 解析&#xff1a; 最大距离即为每相邻两盏灯之间的最大距离/2 注意起点没有灯&#xff0c;终点可能有灯&#xff0c;需要分别判断 #include<bits/stdc.h> using nam…

Cesium态势标绘专题-直线箭头(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

大语言模型LLM

目录 一、语言模型的发展 语言模型&#xff08;Language Model&#xff0c;LM&#xff09;目标是建模自然语言的概率分布&#xff0c;具体目标是构建词序列w1,w2,...,wm的概率分布&#xff0c;即计算给定的词序列作为一个句子出现可能的大小P(w1w2...wm)。但联合概率P的参数量…

0-虚拟机补充知识

虚拟机克隆 如果想要构建服务器集群&#xff0c;没有必要一台一台的去进行安装&#xff0c;只要通过克隆就可以。 快速获得多台服务器主要有两种方式&#xff0c;分别为&#xff1a;直接拷贝操作和vmware的克隆操作 直接拷贝 将之前安装虚拟机的所有文件进行拷贝&#xff0…

git撤销上一次的commit

一行命令 git reset --soft HEAD^如果在vscode上面&#xff0c;就可以