MYSQL–>SQL优化

Insert优化

优化原因:MYSQL数据库中insert每执行一次都会对数据库进行一次连接,会浪费很大资源。

优化方案:

批量插入

插入数据的时候尽量一次性批量插入多个数据而不是一个数据插入一次。

手动提交事务

在事务中写多个insert语句最后一次性commit提交。

主键顺序插入

插入数据的时候尽量1,2,3,4按照顺序插入从而避免更多的资源浪费。

大批量数据插入

使用load指令直接将本地的大批量数据加载到数据库中。

用法:

  1. 查看是否打开了本地加载数据的开关
select @@local_infile;
  1. 进入数据库的时候加上参数
Mysql -local-infile -u 账户 -p 密码
  1. 开启加载本地文件到数据库的开关
set global local_infile=1;
  1. 加载数据
load data local infile '本地数据文件路径' into table 表名 fields terminated by '一行内数据的分割符号' , lines terminated by '换行符号';

主键优化

索引组织表(IOT)

在innodb引擎中表数据是根据主键顺序存放的。这种存储关系叫 索引组织表(IOT)

MYSQL-->SQL优化
如上图,就是以主键顺序存放的索引组织表。

叶子节点存放数据,非叶子节点起到索引的作用。

这些黄色的块全部是由逻辑层次结构页(page)组成的。

页是innodb磁盘管理的最小单元,最大16k

页内数据根据主键顺序插入

页分裂

页可以为空,可以存一半,可以充满。

每一个页知识包含2行数据,如果某一行数据过大会产生行溢出现象。

主键顺序插入的流程图

MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化
10. 将第二页写满

MYSQL-->SQL优化

主键乱序插入的流程图

MYSQL-->SQL优化
MYSQL-->SQL优化
MYSQL-->SQL优化

页合并

MYSQL-->SQL优化

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

当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将俩个页合并从而优化空间使用。

最终会变成如图

MYSQL-->SQL优化

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

MERGE_THRESHOLD参数设置过程

创建表的时候设置

create table 表名(
字段1 类型,
...

字段n 类型
)comment='MERGE_THRESHOLD=45';

修改

ALTER TABLE t1 COMMENT='MERGE_THRESHOLD=40';

主键设计原则

  1. 尽量降低主键的长度 理由:在聚集索引和二级索引中,如果二级索引很多并且,主键索引很长那么会占用很大的空间,搜索的时候会降低大量的磁盘io。
  2. 插入数据的时候尽量使用顺序插入,auto_increment约束

理由:如果乱序插入会可能出现页分裂现象

  1. 业务操作的时候避免对主键的修改

Order by优化

explain中的extra会出现俩种情况在order by中

  1. using filesort

通过表的扫描或者索引,读取满足条件的数据行,然后在 排序缓冲区(sort buffer)中完成排序操作,所有不是通过索引直接返回排序结构的叫using filesort,需要查出来后额外排序,效率低。

  1. using index

通过有序索引顺序扫描直接返回有序结构,不需要额外排序操作,效率高。

  • *将using filesort优化成using index的办法

解决办法:在创建索引的时候规定排序方式

create index 索引名 on 表名(字段1 排序方式,字段2 排序方式...);

注意要点:记得遵循索引规则

  • *如果无法避免必须使用using filesort

可以增加sort_buffer_size区的大小(默认256kb)

查询sort_buffer_size的大小

show variables like 'sort_buffer_size';

设置sort_buffer_size的大小

set global sort_buffer_size=大小;

Group by优化

explain中的extra会出现一种情况说明group by的效率较低

  • using tempory 代表MYSQL使用了临时表

解决办法:给分组的字段加上索引即可解决。

Limit优化

对于Limit进行大数据量的分页,页越往后效率就越低。

原因:limit 2百万 10 需要对2百万的数据进行排序再返回2百万–2百万零10的记录并丢失其他记录。

解决办法:

一般分页查询的时候,通过创建覆盖索引能提高性能,可以通过 覆盖索引+子查询的方式进行优化。

用法举例

假设我们有一张表student

id name 1 a 2 d 3 d 4 c 5 a

假设这张表有1千万条数据id最大=1千万。

这张表的id为主键索引

select id from a order by id limit 90000,10;  ->子查询
select s.* from student s,(select id from a order by id limit 90000,10) a where s.id=a.id;

这样通过子查询+覆盖索引可优化limit

Count优化

  • 在MYISM存储引擎
  • 在InnoDB存储引擎中他会将表一行行读取并累加,类似与循环+

优化思路:使用触发器在insert或者delete的时候+1或-1并存储在表中某一字段内即可。

count的几种情况

count(*) InnoDB引擎不会把字段全部取出而是专门做了优化,不取值直接在服务层按行进行类型。 count(1) 我们所查询的每一条记录都会放一个1进去,然后在服务器层对数据进行累加(如果是1不是null就+1) count(主键) InnoDB引擎会遍历整张表,然后把每一行的主键id值取出,返回给服务器层,服务器层拿到后直接开始累加(因为主键不可能为null) count(字段) 1. 没有not null约束:innoDB引擎会遍历整张表,然后把每一行的字段值取出返回给服务器层判断是否为null 2. 有not null的约束:InnoDB引擎会遍历整张表,然后把每一行的字段值取出返回给服务器层直接开始累加

从上到小效率依次降低

Update优化(避免行锁升级为表锁)

在InnoDB引擎中开启事务后执行update语句他会将数据行锁住即行锁。

事务没提交前行锁不会释放。

注意一定要对索引数据进行更新才能避免从行锁升级为表锁。

原因:在InnoDB引擎中他不是针对记录加的行锁而是根据索引加的行锁,在更新数据的时候如果索引失效那么就会从行锁升级为表锁。

Original: https://www.cnblogs.com/wdadwa/p/MYSQL_Learning_08.html
Author: wdadwa
Title: MYSQL–>SQL优化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JUC并发编程进阶!!

    1.知识点回顾及延伸 2.生产者消费者问题 3. 八锁问题 4.集合类线程不安全解决 5.Callable再理解 6.三大常用辅助类 6.1、 CountDownLatch 6.2…

    数据库 2023年6月16日
    0134
  • 01-MySQL连接查询、聚合函数

    1、连接查询 1.1、左连接 以左表为基准进行查询,左表数据回全部显示出来 右表中如果匹配连接条件的数据则显示相应字段的数据,如果不匹配,则显示为NULL 1.2、右连接 以右表为…

    数据库 2023年6月16日
    0152
  • mysql进阶

    mysql进阶 1.下载二进制格式的mysql软件包 [root@mr ~]# wget https://downloads.mysql.com/archives/get/p/23…

    数据库 2023年5月24日
    0172
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    091
  • Javaweb09-请求跳转项目 分页条件查询 + 增删改 + 邮件登录

    1、Jar 包 UTF-8 1.7 1.7 1.18.12 4.11 5.1.47 1.2.62 javax.servlet javax.servlet-api 3.1.0 pro…

    数据库 2023年6月16日
    0147
  • Python递归遍历目录并删除文件中的前N行

    1 import os 2 3 # 遍历目录下的所有文件 4 def check_file(file_path): 5 os.chdir(file_path) 6 print(os…

    数据库 2023年6月14日
    0105
  • Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思。 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目。其中,这些服务需要用到Nacos、MyS…

    数据库 2023年6月14日
    0122
  • MySQL实现 group_concat 排序

    MySQL支持实现group_concat() 内部自定义排序: 实例: 新建一张表 reward,表中数据如下: SQL: SELECT uid, GROUP_CONCAT(mo…

    数据库 2023年6月14日
    0126
  • Linux 下安装 redis

    2、使用命令下载: 3、将文件拷贝到安装目录 /usr/local 目录下 4、进入 /usr/local 目录下,解压安装包 5、进入解压后的目录 6、编译,将 redis 安装…

    数据库 2023年6月14日
    0130
  • Java8Stream流

    Stream流呢,以前我也有所了解,像一些面试题中也出现过,Java8的新特性,有一块就是这个Stream操作集合,而且在看一些项目中也使用的比较多。但总感觉自己学的一知半解,所以…

    数据库 2023年6月11日
    0123
  • SQL的多表查询

    显示内连接: select 字段列表 from 表1 [inner] join 表2 on 连接条件; (PS:方括号(“[]”)内的为可选项;) (注意:…

    数据库 2023年5月24日
    0133
  • Java中的SPI原理浅谈

    在面向对象的程序设计中,模块之间交互采用接口编程,通常情况下调用方不需要知道被调用方的内部实现细节,因为一旦涉及到了具体实现,如果需要换一种实现就需要修改代码,这违反了程序设计的&…

    数据库 2023年6月14日
    0111
  • 【黄啊码】MySQL入门—4、掌握这些数据筛选技能比你学python还有用-1

    大家好!我是黄啊码,今天没继续select * 了吧,如果还继续,那接下来的课程先别学,回去好好把之前的课程重复复习一遍,学明白了我们再会?废话不多说,学今天的课程之前我们先来说说…

    数据库 2023年6月16日
    0103
  • 处理mysql主从不同步问题

    问题描述:发现主库操作数据从库没有变动问题,可能原因是从库重启导致的无法同步问题。 排查思路: 1、查看主从复制状态 发现从库的IO 和SQL 进程都是no(正常状态应该是yes)…

    数据库 2023年5月24日
    0133
  • RadonDB MySQL on K8s 2.1.4 发布

    RadonDB MySQL Kubernetes 于 4 月 7 日正式发布新版本 2.1.4。该版本主要对可用性进行了优化,新增中英文文档,并修复一些问题。 致谢 首先感谢 @a…

    数据库 2023年6月11日
    0119
  • java面试题总结

    1,集合类面试题 arraylist和linkedlist的区别?底层实现?手写实现?线程安全吗以及原因? hashmap的底层实现?put()执行过程?put null时的执行过…

    数据库 2023年6月11日
    0122
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球