[MySQL]SQL优化之sql语句优化

🌈键盘敲烂,年薪30万🌈

目录

一、索引优化 回顾:

📕索引分类:

📕索引失效:

📕设计原则:

📕SQL性能分析

二、SQL优化 语句优化

📕 insert语句:

📕 主键优化:

📕 order by优化:

📕 group by优化:

📕 limit 优化

📕 count 优化

📕 update 优化 


一、索引优化 回顾:

📕索引分类:
  • 一般分类:主键索引、唯一索引、常规索引、全文索引
  • 按存储分类:聚集索引、二级索引

注意:

主键索引只能有一个且必须有一个,二级索引可以有多个,如果没有主键,选唯一索引作为主键索引,如果没有唯一索引,那么mysql会创建一个隐藏字段rowid作为索引。

 

📕索引失效:
  • 不满足最左前缀法则
  • 索引列计算
  • 字符串类型不加'' 导致类型转化
  • 使用or连接了非索引的列
  • %在最左边,>或<号
  • 数据分布影响

📕设计原则:

    尽量建立联合索引,针对于数据量大(超百万),查询多的表建索引,针对于where order by group by后的字段创建索引,如果字段很长,考虑前缀索引,如果索引列不能为NULL,须在数据库字段加上not null约束,这样优化器可以更好的选择更有效的索引。

📕SQL性能分析
  1. 执行频次
  2. 慢查询日志
  3. profile
  4. expplain执行计划 

二、SQL优化 语句优化

📕 insert语句:

批量插入优化:

  • 一次性插入多条数据,但是不建议超过1000条。
insert into user values(1, 'zhangsan'), (2,'lisi');

手动提交事务优化:

  • 超过1000条,手动开启提交事务,减少与数据库的交互。
start transactioninsert into user values(1, 'zhagnsan'), (2, 'lisi'), ……
insert into user values(1000, 'wangwu'), (1001, 'zhaoliu') ……
……commit

主键顺序插入优化:

大批量插入数据优化:

  • load:插入百万数据到数据库

  • load使用三步走:

1.连接数据库时加上:

--local-infile

2.打开全局参数:

set global local infile = 1;

3.插入数据的脚本:

load data local infile '/root/sql1.log' into table 'tb_user' fields terminated by ',' line terminated by '\n';

📕 主键优化:

前面提到了主键按顺序插入可提高性能,这里讲解原理。

(这里我不是很明白,摘自GPT的回答)

页分裂:

  • 当在一个已满的页(节点)中插入一个新的键时,可能会导致该页不足以容纳新键,因此需要进行页分裂。
  • 页分裂的过程涉及将原有的页分成两半,并将其中一半的部分移动到一个新的页中。这样就在原有页和新页之间创建了一个新的分隔键,用于指示两个页之间的分割。
  • 页分裂的目的是确保树的平衡,并维护索引的有序性。它通常发生在B树或B+树中。

页合并:

  • 与页分裂相反,页合并发生在删除操作后。当一个页的键减少到一个临界点以下时,可以考虑将其与相邻的页合并,从而减少索引树的高度。
  • 页合并的过程涉及将两个相邻的页合并成一个,并且删除在合并过程中用于分隔的键。这有助于保持树的平衡,并且减少了树的高度,提高了检索效率。
  • 页合并通常也发生在B树或B+树这样的平衡树结构中。

小结:

    索引的设计原则:长度尽量短,尽量有序插入。


📕 order by优化:

优化准则:

  • 如果创建索引的排序规则和要查询语句的排序规则相同,那么直接返回数据,效率高,如果不同,需要在缓冲区对相应的字段进行排序,效率不高。

注意:

创建索引默认是升序排序,asc

创建索引是指定排序规则

create index id_na_ty on tb_book(name asc, type asc);

例如:

一张tb_book表的索引

  • 执行语句1(升序排序查询):
select id, name, type from tb_book order by name asc, type asc;-- 直接返回索引下面挂的数据,效率高

查看执行过程:

  •  执行语句2(name 升序 type 降序)
select id, name, type from tb_book order by name asc, type desc;-- 会在缓冲区进行排序,效率不高。

查看执行过程:

小总结:

order by 查询的字段要与建立索引时字段的排序规则相同,若不同,会在缓冲区排序然后返回数据,可以在创建索引时指定排序规则

📕 group by优化:

跟order by类似,建立好相应的索引,并且保证索引正确的使用规则,比如最左前缀法则。

📕 limit 优化

记住:覆盖索引加子查询:

原理:原本要对数据进行排序,在挑选50条数据,现在使用索引覆盖 + 子查询 先根据id排序,排完之后直接子查询就可以啦。

select * from user where limit 10000, 50;
-- 回表查询性能低
select t.* from user t, (select if from user where order by id limit 10000, 50) s where t.id = s.id;
-- 覆盖索引 + 子查询 性能略好
📕 count 优化

count统计非空字段数量,count无法优化,但是我们要区分count()括号里的字段的含义

  1. count(*):不取值,直接累加。
  2. count(主键):取出主键id,累加
  3. count(某个字段:有非空约束):取值,返回给服务层,服务层直接累加
  4. coutn(某个字段:无非空约束):取值,返回给服务层,服务层判断后累加。
  5. count(1):每行放一个1 并且累加,只要不是null都可以累加

小结:

尽量使用count(*)

📕 update 优化 
  • 更新的条件一定要有索引,否则行锁会标为表锁。

例如:user表 name字段带有索引

一个客户端执行:update user set name = 'Zhangsan' where name = 'Lisi';

一个客户端执行:update user set name = 'wangwu' where name = 'zhaoliu';

分析:

此时可以并发执行,因为索引对应的是行级锁,不会锁整张表,相反如果没有索引,或者索引失效,行级锁就会变为表锁,无法高并发。

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

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

相关文章

越南语翻译,人工翻译哪个值得信赖?

近年来&#xff0c;随着中越两国的交流日益频繁&#xff0c;为了促进双方的交流与理解&#xff0c;市场上对越南语翻译的需求也日益增加。那么&#xff0c;如何做好越南语翻译&#xff0c;人工翻译哪家公司值得信赖呢&#xff1f; 据了解&#xff0c;中文翻译越南语是一项颇具挑…

科技与艺术相结合,虚拟人裸眼3D动画亮相城市商圈

随着元宇宙概念的火爆&#xff0c;虚拟制作技术的快速发展&#xff0c;虚拟人可以将虚拟世界与现实世界相结合&#xff0c;为用户带来沉浸式体验。如虚拟人壬子希以裸眼3D动画的形式亮相城市商圈&#xff0c;助力文旅以科技与艺术相结合的形式&#xff0c;展现城市文化与科技成…

从运维角度去了解redis

一、介绍 1.简介 redis是一个开源的、使用C语言编写的、可基于内存也可持久化的Key-Value数据库&#xff0c;采用单线程基于epoll模型实现IO多路复用非阻塞的处理模式。 2.特点 1.丰富的数据结构 -----Redis支持五种数据类型&#xff1a;string&#xff08;字符串&#xf…

【数据结构(九)】顺序存储二叉树(2)

文章目录 1. 相关概念2. 顺序存储二叉树的遍历 1. 相关概念 从数据存储来看&#xff0c;数组存储方式和树的存储方式可以相互转换&#xff0c;即数组可以转换成树&#xff0c;树也可以转换成数组&#xff0c;看右面的示意图。 转换原则:     1.上图的二叉树的结点&#xff…

项目包管理工具_poetry

1 介绍 Poetry 是一个用于 Python 项目的包管理工具&#xff0c;它相对于传统的 pip 和 requirements.txt 的优势在于&#xff1a;使得项目依赖管理更加方便&#xff0c;且结合了更多新工具&#xff0c;还提供命令行进一步配置。 当在同一系统或在同一个 docker 中&#xff0…

Java对List<Map>进行合并去重

对List进行合并去重&#xff0c;首先创建一个新的 List 用于存储合并去重后的结果&#xff0c;遍历原始的 List&#xff0c;将每个 Map 对象中的键值对放入一个 Set 中进行去重&#xff0c;最后将去重后的键值对重新组装成一个新的 Map 对象&#xff0c;并添加到新的 List 中。…

每日一练【长度最小的子数组】

一、题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 二、题目解析 经…

DeepDrive双转子径向磁通电机

DeepDrive公司开发的是一种高效、高性能、低成本的双转子径向磁通电机系统&#xff08;含控制器&#xff09;。该系统具有较高的成本效益和资源效率&#xff0c;并拥有更高的能效&#xff0c;能显著提升电动车续航能力&#xff0c;同时亦能有效控制生产成本&#xff0c;减少自然…

3_流量预测综述阅读_Cellular traffic prediction with machine learning: A survey

为了方便学习英语书写&#xff0c;总结的一些话用英语书写 ♥目录♥ 0、文献来源and摘要1、introduction2、prediction problems and datasets2.1 prediction problems2.2 dataset&#xff08;1&#xff09;Telecom Italia 意大利电信 2015&#xff08;2&#xff09;City Cell…

C语言习题集(028)

//写一个函数&#xff0c;输入一行字符&#xff0c;将此字符串中最长的 //单词输出。 /* */ //解答&#xff1a; #include<stdio.h> void choose(char s[100]); int main() { char str[100]; printf("请输入一段字符&#xff1a;"); gets(str); printf(&q…

产品经理常有的几大误区,90%都会犯!

产品管理对项目来说非常重要&#xff0c;但在日常工作中&#xff0c;我们往往容易进入思维误区&#xff0c;如果我们没有及时发现错误并进行纠正&#xff0c;这会对产品需求工作以及项目进度产生较大影响。 因此我们需要重视产品工作中常见的思维误区并及时避免&#xff0c;需…

AI写文案工具大全介绍,免费的AI写文案工具

随着人工智能技术的不断发展&#xff0c;AI写文案成为一个备受关注的话题。本文将专注于AI写文案工具&#xff0c;深入探讨各类好用的AI写文案软件。 AI写文案工具介绍&#xff1a; OpenAIs GPT系列&#xff1a; GPT-3是由OpenAI开发的语言模型&#xff0c;能够生成高质量的文…

uniapp点击按钮,防止按钮多次点击多次触发事件【防抖操作】

图片、 一、在根目录下新建common文件并创建common.js文件&#xff0c;输入下面代码 // 防止处理多次点击function noMultipleClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点…

C语言leetcode集训二:字符串(1):字符串遍历

今天集训的内容是字符串中的字符串遍历题&#xff0c;仍然是简单题&#xff0c;但也可以掌握一些字符串所必要的知识&#xff0c;加深对字符串的理解&#xff0c;关于字符数组和字符串&#xff0c;字符串的输入输出在这就不再做过多赘述&#xff0c;关于字符串的问题&#xff0…

编写一程序,输入月份,输出该月的英文名。例如,输入“3”,则输出March,要求用指针实现。(两种方法,指针和指针数组)

1.用两个指针&#xff0c;一个代表行&#xff0c;一个代表列 #include<stdio.h> #include<math.h> #include<string.h>int main(){int m;scanf("%d",&m);char *hang,lie 0;char s[12][50] {"January","February","…

Debezium日常分享系列之:Debezium 2.5.0.Beta1发布

Debezium日常分享系列之&#xff1a;Debezium 2.5.0.Beta1发布 一、重大变化1.分片部署中的 MongoDB 快照2.移除ComputePartition SMT3.JDBC 接收器值序列化更改 二、新功能和改进1.初始快照的附加通知2.MySQL高精度源时间戳3.MariaDB GTID 支持4.从 PostgreSQL 16 备用服务器进…

VR游戏虚拟现实游戏的发展:现状与未来

随着技术的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;游戏已经从一个尖端概念转变成为一个日益成熟和普及的行业。本文探讨了VR游戏的当前发展状况和面临的挑战&#xff0c;以及其未来的潜在趋势。 技术进步推动VR游戏发展 VR硬件的革新是推动该领域发展的主要…

串口通信(1)-硬件知识

本文讲解串口通信的硬件知识。让读者快速了解硬件知识&#xff0c;为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…

【SpringBoot】入门精简

目录 一、初识 SpringBoot 1.1 介绍 1.2 项目创建 1.3 目录结构 1.4 修改配置 二、SpringBoot 集成 2.1 集成 Mybatis框架 2.2 集成 Pagehepler分页插件 2.3 集成 Druid数据库连接池 2.4 集成 Log日志管理 一、初识 SpringBoot 1.1 介绍 Spring Boot是一个用于简化Sp…

猎豹浏览器如何设置ip使用?socks5在网络安全中有什么优势?

猎豹浏览器如何设置ip使用&#xff1f;socks在网络安全中有什么优势&#xff1f; 一、猎豹浏览器如何设置ip使用&#xff1f; 在使用猎豹浏览器时&#xff0c;可以通过以下步骤来设置IP使用&#xff1a; 1. 打开猎豹浏览器&#xff0c;点击右上角的“菜单”按钮&#xff0c;在…