MySQL学习笔记-进阶篇-SQL优化

SQL优化

插入数据

insert优化

  • 1)批量插入

insert into tb_user values(1,'Tom'),(2,'Cat'),(3,'Jerry');

  • 2)手动提交事务

mysql 默认是自动提交事务,这样会导致频繁的开启和提交事务,影响性能

start transaction

insert into tb_user values(1,'Tom'),(2,'Cat'),(3,'Jerry');

insert into tb_user values(4,'Tom'),(5,'Cat'),(6,'Jerry');

insert into tb_user values(7,'Tom'),(8,'Cat'),(9,'Jerry');

commit;

  • 3)主键顺序插入

主键乱序插入会导致索引页频繁的进行页分裂,导致性能降低,具体参见主键优化中的内容。

主键乱序插入:8 1 9 21 88 2 4 15 89 5 7 3

主键顺序插入:1 2 3 4 5 7 8 9 15 21 88 89

大批量插入数据

如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用mysql数据库提供的load指令进行插入,操作如下:

需要三步:

1、客户端连接服务端时,加上--local-infile

mysql --local-infile -u root -p

2、设置全局参数local_infile为1,开启从本地加载文件导入数据的开关

set global local_infile=1;

3、执行load指令,将准备好的数据加载到表结构中。

load data local infile ‘地址(例如:/root/mysql1.sql)’  into table '表名称(例如:table_name)'  fields terminated by ',' lines terminated by '\n'

主键优化

数据组织方式

在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(Index Orgnized Table IOT)

mysql的逻辑存储结构如下:

页分裂

页可以为空,也可以填充一半,也可以填充100%,每个页包含了2-n行数据(如果一行数据过大,会行溢出),根据主键排列。

主键顺序插入

主键乱序插入

主键乱序插入,会造成页分裂,应该尽量避免这种现象。

页合并

当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除,并且它的空间变得允许被其他记录声明使用。

当页中删除的数据超过MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后),看看是否可以将两格页合并以优化空间使用

小贴士:

MERGE_THRESHOLD:合并页的阈值,可以自己设置,在创建表或创建索引时指定。

⭐️主键设计原则:

满足业务需求的情况下,尽量降低主键长度。(因为二级索引的页节点存储的是主键)

插入数据时,尽量选择顺序插入,选择AUTO_INCREMET的自增主键

尽量不要使用UUID做主键或者其他自然主键做主键,例如身份证号。

业务操作时,尽量避免对主键的修改

order by 优化

order by的查询计划中Extra有两种:

排序分类

Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中进行排序操作,所有不是通过索引直接返回排序结果的排序,都叫FileSort排序。

Using index:通过有序索引扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高

演示

没有创建索引时,根据age、phone进行排序

explain select id,age,phone from tb_user order by age,phone;

创建索引,排序方式是asc默认,可以省略

create index idx_user_age_phone_aa on tb_user(age,phone)

创建索引后,根据age、phone进行升序排序,走索引,using index

explain select id,age,phone from tb_user order by age,phone;

创建索引后,根据age、phone进行降序排序,走索引,backward index scan;using index

explain select id,age,phone from tb_user order by age desc,phone desc;

根据age、phone进行排序,一个升序,一个降序

explain select id,age,phone from tb_user order by age asc,phone desc;

创建索引

create index idx_user_age_phone_sd on tb_user(age asc,phone desc)

根据age、phone进行排序,一个升序,一个降序 using index

explain select id,age,phone from tb_user order by age asc,phone desc;

order by优化原则

根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则;

尽量使用覆盖索引;

多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)

如果不可避免的出现了filesort大数据量排序的时候,可以适当增大排序缓冲区大小sort_buffer_size(默认是256K)

group by 优化

演示

优化原则

在分组操作时,可以通过索引提高效率;

分组操作时,索引的使用也是满足最左前缀法则;

limit 优化

一个常见又非常头疼的问题是limit 2000000,10,此时需要mysql排序前2000010条记录,仅返回2000000-2000010的记录,其他数据丢弃,查询排序的代价非常大

优化思路:覆盖索引+子查询

一般分页查询时,通过创建覆盖索引,能够比较好的提高性能,可以通过覆盖索引加子查询的方式优化。

explain select * 
from tb_sku t,
(select id from tb_sku order by id limit 2000000,10)a 
where t.id=a.id

count 优化

explain select count(*) from tb_sku;

count的快慢是有存储引擎决定的

MyISAM把一个表的数据总行数存在了磁盘上,因此执行count(*)的时候直接返回这个数,效率很高;

InnoDB引存储擎就麻烦了,它执行count(*)的时候,需要把数据一行一行的从引擎里读出来,然后累积计数;

优化思路:自己计数

例如存入redis

count的几种用法

count()是一个聚合函数,对于返回的结果集,一行一行的判断,如果count函数的参数不是null,累计值就加1,否则不加,最后返回累计值。

用法:count(*)、count(主键)、count(字段)、count(1)

效率

count(字段)<count(主键)<count(1)≈count(*)

所以尽量使用count(*)

update优化

演示

行级锁

表级锁

InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则会从行锁升级为表锁

优化原则:

尽量使用行级锁,避免表级锁;

更新条件使用索引,加的锁是行锁;

索引失效,导致行锁升级表锁;

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

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

相关文章

【面经总结】Java基础 - SPI

SPI 什么是 SPI&#xff1f; 提供给服务提供者去使用的一个接口 SPI 的优点 低耦合配置灵活多态性 SPI 的应用场景 JDBCSLF4J 日志

Pandas AI:最棒的大模型数据分析神器!

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解惑答疑&…

C++ 46 之 关系运算符的重载

#include <iostream> #include <string> using namespace std;class Students06{ public:string m_name;int m_age;Students06(string name, int age){this->m_name name;this->m_age age;}// 重载了 bool operator(Students06 &stu){if(this->m_na…

java:spring actuator添加自定义endpoint

# 项目代码资源&#xff1a; 可能还在审核中&#xff0c;请等待。。。 https://download.csdn.net/download/chenhz2284/89437274 # 项目代码 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId&…

Cocos2d-x 4.0 工程首次建立与编译(Mac m1)

Mac m1芯片下将cocos2d-x升级至4.0版本后&#xff0c;官方剔除了不同平台的工程以及变更了编译方式&#xff0c;直接使用cmake构建&#xff0c;需要做一些前置的准备工作。 环境准备&#xff1a; 项 版本 备注 MacOS10.3 or laterpython2.7.16(建议>2.7.10)cmake3.29.3Do…

Android 工程副总裁卸任

Android 工程副总裁卸任 Android工程副总裁Dave Burke宣布&#xff0c;他将辞去领导Android工程的职位&#xff0c;将重心转向“AI/生物”项目。不过&#xff0c;他并没有离开Alphabet&#xff0c;目前仍将担任Android系统开发顾问的角色。 Burke参与了Android系统的多个关键…

TCP三次握手的过程

一、什么是TCP TCP是面向连接的、可靠的、基于字节流的传输层通信协议。 二、TCP的头部格式 序列号:在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过SYN包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。用来解…

155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

PCB设计简介

PCB电路板各层的含义 A. Signal And Plane Layers(S) 1. Signal Layers(信号层): 信号层主要用于布置电路板上的导线。Altium Designer提供了32个信号层&#xff0c;包括Top layer(顶层)&#xff0c;Bottom layer(底层)和32个内电层。 包括&#xff1a;Top layer(顶层),Bott…

CleanMyMac占用内存大吗 CleanMyMac如何释放内存空间

Mac OS上内存可谓是“寸土寸金”&#xff0c;每一M的内存都是真金白银换来的。为了有更充足的系统空间&#xff0c;有用户会使用系统清理和优化工具CleanMyMac&#xff0c;那么下面我们来看看CleanMyMac占用内存大吗&#xff0c;CleanMyMac如何释放内存空间的相关内容吧。 一、…

spring boot配置ssl证书,支持https访问

1. 阿里云官网下载证书,云控制台搜索ssl&#xff0c;点击进入。 2.点击免费证书&#xff0c;立即购买。 3. 点击创建证书&#xff0c;填写完证书申请后&#xff0c;等待证书签发。 4. 证书签发以后&#xff0c;点击下载证书&#xff0c;spring boot选tomcat服务器类型的。 5. …

Linux应用编程 - i2c-dev操作I2C

嵌入式Linux操作I2C设备&#xff0c;我们一般会在内核态编写I2C驱动程序。另外还能在用户空间编写I2C程序&#xff0c;下面介绍相关代码的实现。 i2c-dev框架在内核中封装了I2C通信所需要的所有通信细节&#xff0c;I2C适配器会在/dev目录下创建字符设备&#xff0c;例如&#…

如何避免销售飞单私单!教你如何巧妙避开陷阱,业绩飙升!

明明投入了大量的时间和精力&#xff0c;客户却悄无声息地消失了&#xff1f;或是突然有一天&#xff0c;你发现原本属于你的订单被同事悄悄抢走&#xff1f;这背后&#xff0c;很可能隐藏着销售飞单私单的陷阱。今天&#xff0c;就让我们一起探讨如何巧妙避开这些陷阱&#xf…

TCP与UDP案例

udp不会做拆分整合什么的 多大就是多大

MyBatis使用Demo

文章目录 01、Mybatis 意义02、Mybatis 快速入门04、Mapper 代理开发05、Mybatis 配置文件07、查询所有&结果映射08、查询-查看详情09、查询-条件查询10、查询-动态条件查询多条件动态查询单条件动态查询 11、添加&修改功能添加功能修改功能 12、删除功能删除一个批量删…

【html】学会这一套布局,让你的网页更加

很多小伙伴们在刚刚开始学习网页设计的时候不知道怎么布局今天给大家介绍一种非常实用且更加专业的一种布局。 灵感来源&#xff1a; 小米官网 布局图; 实例效果图&#xff1a; 这是一个简单的HTML模板&#xff0c;包括头部、内容区域和底部。 头部部分包括一个分为左右两部分…

【记录】ChatGLM3-6B大模型部署、微调(二):微调

前言 上文记录了ChatGLM3-6B大模型本地化部署过程&#xff0c;本次对模型进行微调&#xff0c;目的是修改模型自我认知。采用官方推荐微调框架&#xff1a;LLaMA-Factory 安装LLaMA-Factory # 克隆项目 git clone https://github.com/hiyouga/LLaMA-Factory.git 安装依赖 # 安装…

Linux---系统的初步学习【项目一:Linux操作系统的安装与配置】

项目一 Linux操作系统的安装与配置 1.1 项目知识准备 1.1.1 操作系统是什么&#xff1f; ​ 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理硬件、决定程序运行的优先次序、管理文件系统等…

逻辑斯蒂回归与最大熵

知识树 感知机的缺陷 修补感知机缺陷-逻辑斯蒂回归 下面这两个值是强制给的,不是推导的 最大熵 最大熵的一个小故事 最大熵模型 我们最终目标是要求P(Y|X) 书上写的是H,但是2我们认为H(Y|X)更合适 咱们最终的目的是要用拉格朗日乘数法,所以需要约束 总结 感觉深度之眼比较模…

汽车级TPSI2140QDWQRQ1隔离式固态继电器,TMUX6136PWR、TMUX1109PWR、TMUX1133PWR模拟开关与多路复用器(参数)

1、TPSI2140-Q1 是一款隔离式固态继电器&#xff0c;专为高电压汽车和工业应用而设计。 TPSI2140-Q1 与 TI 具有高可靠性的电容隔离技术和内部背对背 MOSFET 整合在一起&#xff0c;形成了一款完全集成式解决方案&#xff0c;无需次级侧电源。 该器件的初级侧仅由 9mA 的输入电…