【MySQL 数据库】7、SQL 优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 【MySQL 数据库】7、SQL 优化


一、插入数据优化

(1) insert 语句

① 批量插入数据

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

② 手动控制事务

start transaction;
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');
insert into tb_test values(4,'Tom'),(5,'Cat'),(6,'Jerry');
insert into tb_test values(7,'Tom'),(8,'Cat'),(9,'Jerry');
commit;

③ 主键顺序插入,性能要高于乱序插入

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

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

(2) load 大批量插入数据【☆❀

① 如果需要一次性插入大批量数据(百万级别),使用 insert 语句插入性能很低

② 可使用 MySQL 数据库提供的 load 指令进行插入


可执行如下指令,将数据脚本文件中的数据加载到表结构中:

-- 客户端连接服务端时,加上参数 -–local-infile
mysql –-local-infile -u root -p
-- 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
-- 执行load指令将准备好的数据,加载到表结构中
load data local infile '/root/sql1.log' into table tb_user fields
terminated by ',' lines terminated by '\n' ;

二、主键优化

主键顺序插入的性能是要高于乱序插入的, 为什么?

(1) 数据组织形式

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

在 InnoDB 存储引擎中,数据行是记录在逻辑结构 page 页中的,而每一个页的大小是固定的,默认16K。那也就意味着, 一个页中所存储的行也是有限的,如果插入的数据行 row 在该页存储不小,将会存储到下一个页中,页与页之间会通过指针连接。

(2) 页分裂

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


(3) 页合并

(4) 主键设计原则

  • 满足业务需求的情况下,尽量降低主键的长度
  • 插入数据时,尽量选择顺序插入,选择使用 AUTO_INCREMENT 自增主键
  • 尽量不要使用UUID做主键或者是其他自然主键,如身份证号
  • 业务操作时,避免对主键的修改

三、orber by 优化

  • MySQL的排序,有种方式:
  • Using filesort : 全表扫描,读取满足条件的数据行,然后在排序缓冲区 sort buffer 中完成排序操作。所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序
  • Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。
  • Using index 的性能高,而 Using filesort 性能低

  • 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  • 尽量使用覆盖索引。
  • 多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
  • 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小 sort_buffer_size(默认256k)。

四、group by 优化

  • 在分组操作时,可以通过索引来提高效率。
  • 分组操作时,索引的使用也是满足最左前缀法则的

五、limit 优化(分页)

  • 在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。
  • 在进行分页查询时,如果执行limit 2000000,10 ,此时需要MySQL排序前2000010 条记录,仅仅返回 2000000 - 2000010的记录,其他记录丢弃,查询排序的代价非常大

优化思路: 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询(多表联查)形式进行优化

六、count 优化

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

用法:

  • count(*)
  • count(主键)
  • count(字段)
  • count(数字)

七、update 优化

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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
25 13
|
5天前
|
存储 缓存 监控
如何优化数据库子查询?
【7月更文挑战第22天】如何优化数据库子查询?
37 15
|
5天前
|
存储 缓存 监控
优化数据库查询的关键
【7月更文挑战第22天】优化数据库查询的关键
18 7
|
1天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之SQL查询该如何优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
1天前
|
关系型数据库 MySQL 数据库
|
2天前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
11 1
|
2天前
|
SQL 缓存 关系型数据库
使用EXPLAIN进行SQL查询优化时,应该关注哪些信息
使用EXPLAIN进行SQL查询优化时,应该关注哪些信息
11 1
|
8天前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用合集之如何实现类似mysql实例中的数据库功能
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
5天前
|
SQL 存储 数据库
性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
|
6天前
|
SQL 缓存 数据库
如何进行SQL优化?
【7月更文挑战第21天】如何进行SQL优化?
17 1