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;其中真正实现自动配置功能的核心实现者 …

1.Oracle建表及使用

1.概述 1. 表&#xff1a;用于 存储数据 -- 是我们最常见的数据库对象 2. 表设计注意事项 (1) 表设计时&#xff0c;尽量遵从 第三范式&#xff08;3NF&#xff09; (2) 名称不能超过 30 个字符 -- 超过会报错 (3) 名称只能以 字母 大头&#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;百度智能云对象存储…

Rust-IO

use std::io::Write; fn main() {/*std::io::stdin() 返回标准输入流stdin的句柄。read_line() stdin的句柄的一个方法&#xff0c;从标准输入流中读取一行数据返回一个Result枚举。会自动删除行尾的换行符\n。unwrap() 是一个帮助的方法&#xff0c;简化恢复错误的处理。返回R…

合并两个有序数组——力扣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;这是指服务…

Kubernetes(K8s)从入门到精通系列之七:K8s的基本概念和术语之安全类

Kubernetes K8s从入门到精通系列之七:K8s的基本概念和术语之安全类 一、安全类二、Role和ClusterRole三、RoleBinding和ClusterRoleBinding一、安全类 开发的Pod应用需要通过API Server查询、创建及管理其他相关资源对象,所以这类用户才是K8s的关键用户。K8s设计了Service A…

MIT 6.830数据库系统 -- lab five

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

centos安装mysql8

安装过程 基本安装过程同mysq5.7&#xff0c;参考&#xff1a;centos7安装mysql5.7_centos7 安装mysql5.7源_shuair的博客-CSDN博客 设置不区分大小写 切记&#xff0c;在第一次启动器前就应修改配置文件&#xff0c;设置不区分大小写&#xff0c;即初始化之前修改&#xff…

使用 docker 一键部署 MongoDB

目录 1. 前期准备 2. 导入镜像 3. 部署MongoDB脚本 4. 配置模板文件 5. 部署MongoDB 6. 部署后配置 7. 基本维护 1. 前期准备 新部署前可以从仓库&#xff08;repository&#xff09;下载 MongoDB 镜像&#xff0c;或者从已有部署中的镜像生成文件&#xff1a; # 查看…

Zookeeper入门介绍

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

NUMA架构在kubernetes中的应用

numactl使用 numactl 通过将 CPU 划分多个 node 减少 CPU 对总线资源的竞争,一般使用在高配置服务器部署多个 CPU 消耗性服务使用。 numactl使用,numa常用命令,numa命令行使用 #numactl -H available: 2 nodes (0-1) node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 node 0…

09mysql之数据处理之增删改

#1. 创建数据库dbtest11 CREATE DATABASE IF NOT EXISTS dbtest11 CHARACTER SET utf8; #2. 运行以下脚本创建表my_employees USE dbtest11; CREATE TABLE my_employees( id INT(10), first_name VARCHAR(10), last_name VARCHAR(10), userid VARCHAR(10), salary DOUBLE(10,2)…

《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”文件夹保…