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)

大家都在看

  • Nginx 配置参数优化

    nginx 配置参数优化 nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求。以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业…

    数据库 2023年6月6日
    0130
  • ZooKeeper集群部署

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    0138
  • mysql 内部函数

    1. group_concat 返回一个字符串结果,该结果由分组中的值连接组合而成。 函数语法: group_concat( [DISTINCT] 要连接的字段 [Order BY…

    数据库 2023年6月16日
    0123
  • 每个开发人员都应该关注的7个优秀的GitHub仓库

    1. FreeCodeCamp 2. Developer Roadmap 3. Awesome 4. Build Your Own X 5. Git Ignore 6. Syste…

    数据库 2023年6月11日
    0138
  • 计算机组成原理——概述篇

    计算机发展历史 电子管计算机(1946 年——1958 年) 第一台计算机为ENIAC 诞生于美国宾夕法尼亚大学 特点: 集成度小,空间占用大 功耗高,运行速度慢 操作复杂,更换程…

    数据库 2023年6月16日
    0102
  • 一个诡异的MySQL查询超时问题,居然隐藏着存在了两年的BUG

    这一周线上碰到一个诡异的BUG。 线上有个定时任务,这个任务需要查询一个表几天范围内的一些数据做一些处理,每隔十分钟执行一次,直至成功。 通过日志发现,从凌晨5:26分开始到5:5…

    数据库 2023年6月16日
    0140
  • MySQL数据库 DDL 阻塞问题定位 【转载】

    陈臣,甲骨文MySQL首席解决方案工程师,公众号《MySQL实战》作者,有大规模的MySQL,Redis,MongoDB,ES的管理和维护经验,擅长MySQL数据库的性能优化及日常…

    数据库 2023年5月24日
    0148
  • 关于VUE中的mapState和mapActions的使用

    最近在开发一套系统,前端使用VUE开发,由于本人是后端开发,前端也会一点,但是VUE接触不多,在VUE项目开发遇到的一些坑记录一下,不是专业前端写好的不好,大家不要唝。。。 在VU…

    数据库 2023年6月9日
    0118
  • 即时通讯课设Android端问题记录

    转眼间,就已经是大四学生,目前正在写毕设。Android 端没有系统的学习过,都是哪里不会查哪里,基本靠度娘。所以,在此记录下课设开发过程中,Android 端遇到的问题。 在主线…

    数据库 2023年6月9日
    0104
  • B+树索引页大小是如何确定的?

    B+树简介 在正式介绍本文的主题前,需要对 B+ 树有一定的了解,B+树是一种磁盘上数据的索引结构,大概长这个样子。 B+树的叶子节点是所有的数据,非叶子节点称为索引页,索引页里有…

    数据库 2023年6月14日
    0105
  • Typora + PicGo + Gitee 解放你对图片的管理

    计算机环境准备 Typora PicGo nodejs Typora官网: https://typora.io/ PicGo官网: https://picgo.github.io/…

    数据库 2023年6月9日
    0112
  • MySQL完整版详解

    一、数据库的操作 1.创建数据库 若在可视化软件上创建数据库,参考如下图 如果要创建的数据库不存在,则创建成功 create database if not exists west…

    数据库 2023年6月16日
    0125
  • 汇编语言学习记录一

    0x00——什么是汇编语言? 汇编语言:早期实现程序员和机器进行交互的汇编指令集。 汇编指令,通过编译器,转换成机器码,从而使 机器 理解其指令。 0x01——汇编语言的组成 汇编…

    数据库 2023年6月11日
    0112
  • MySQL实战45讲 17

    17 | 如何正确地显示随机消息? 场景:从一个单词表中随机选出三个单词。 表的建表语句和初始数据的命令如下,在这个表里面插入了 10000 行记录: CREATE TABLE w…

    数据库 2023年6月14日
    096
  • Css3入门详解

    一、Css基本语法 1.Html和Css没分开 点击查看代码 <!DOCTYPE html> <html lang="en"> <…

    数据库 2023年6月16日
    0119
  • 为什么 SQL 语句使用了索引,但却还是慢查询?

    一、索引与慢查询 聊一聊索引和慢查询,经常遇到的一个问题:一个SQL语句使用了索引,为什么还是会记录到慢查询日志之中?为了说明,创建一个表t,该表3个字段,一个主键索引,一个普通索…

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