MySQL查询优化(中)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: SQL优化 show status 了解各种SQL的执行效率:

存储过程与触发器的区别

两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。

触发器是在一个修改了指定表中的数据时执行的存储过程。

通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。

触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,

存储过程可以通过存储过程名称名字而直接调用。

当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

数据库优化方向

(1)、根据服务层面:配置mysql性能优化参数

(2)、从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等

(3)、从数据库层面增强性能:优化SQL语句,合理使用字段索引。

(4)、从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。

(5)、减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。

(6)、不常使用的数据迁移备份,避免每次都在海量数据中去检索。

(7)、提升数据库服务器硬件配置,或者搭建数据库集群。

(8)、编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤)

大批量的插入数据

当用load导入数据,适当的设置可以提供导入的速度。对于MyISAM存储引擎的表,可以通过以下方式快速导入大量的数据

alter table tab_name disable keys;
loading the data
alter table tab_name disable keys;

disable keys和enable keys 用来打开或者关闭MyISAM表非索引的更新。在导入大量的数据到一个非空的MyISAM表,通过设置这两个命令,可以提高导入的效率

对于Innodb类型的表不能使用上面的方式提高导入效率

因为Innodb类型的表是按照主键的顺序保存,所有将导入的数据按照主键的顺序排序,可以有效地提高导入数据的效率


在导入数据强执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1.恢复唯一性校验,可以提高导入的效率,如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0时,关闭自动提交,导入结束后再执行SET AUTOCOMMIT=1,打开自动提交,也可以提高导入的效率

优化insert语句

  • 如果同时从一个客户端插入很多行,应尽量使用多个值表的insert语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗,使得效率比分开执行的单个insert语句快(大部分情况下,使用多个值表的insert语句那比单个insert语句快上好几倍)。
insert into test values(1,2),(1,3)...

如果从不同客户插入很多行,可以通过使用insert delayed语句提高更高的速度,delayed的含义是让insert语句马上执行,其实数据都被放到内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快的多;LOW_PRIORITY刚好相反,在所有其他用户对表的读写完成后才可以进行

将索引文件和数据文件分在不同的磁盘上存放(利用建表中的选项)

如果进行批量插入,可以通过增加bulk_insert_buffer_size变量值的方法来通过速度,但是,这只能对MyISAM表使用。

当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句块快20倍

ORDER BY优化

InnoDB引擎下,通过有序排序索引顺序扫描,这种方式在使用explain分析查询的时候显示为Using Index,无需额外排序,操作效率较高:

  • 索引的列顺序和Order By子句的顺序完全一致
  • 索引中所有列的方向(升序,降序)和Order by子句完全一致
  • Order by中的字段全部在关联表中的第一张表中
explain select customer_id from customer order by store_id;

image.png

违反规则,则filesort

image.png

第二张通过返回数据进行排序,也就是通常说的Filesort排序,所有不是通过索引直接返回排序结果的排序豆角Filesort排序。

Filesort并不代表通过磁盘文件进行排序,而只是说明进行了一个排序操作,至于排序操作是否进行了磁盘文件或临时表等,

  • 则取决于MySQL服务器对排序参数的设置和需要排序数据的大小-myshim引擎
explain select * from customer order by store_id;

Filesort是通过相应排序算法,将取得的数据在sort_buffer_size系统变量设置的内存排序区进行排序。若内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集。sort_buffer_size设置的排序区是每个线程独占的,所有同一个时刻,MySQL存在多个sort buffer排序区


优化目标:尽量减少额外排序,通过索引直接返回有序数据:

where和ordery by使用相同的索引,并且order by的顺序和索引顺序相同,并且order by的字段都是升序或者都是降序。否则肯定需要额外的排序操作,这样就会出现filesort。

优化group by

若查询包括group by,但想要避免排序结果的消耗,可指定group by null。

优化嵌套查询

子查询

explain select * from customer where customer_id 
  not in(select customer_id from payment)

可以被更有效率的连接替代:

explain select * from customer a left join payment b 
  on a.customer_id=b.customer_id where b.customer id is null

连接之所用更有效率是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两步的查询工作。

优化分页查询

一般分页查询,通过创建覆盖索引能较好地提高性能。

比如limit 1000,20,此时MySQL排序出前1020条数据后,仅需要返回第1001~1020条记录,前1000条数据都被抛弃,查询和排序代价过高。

  • 优化
    可增加一个字段last_page_record,记录上一页和最后一页的编号。通过
explain select ... where last_page_record < ... desc limt ..

但若排序字段出现大量重复,不适用这种方式优化。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
MySQL索引和查询优化
MySQL索引和查询优化
46 1
|
1月前
|
SQL 缓存 关系型数据库
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
MySQL技能完整学习列表6、查询优化——3、查询缓存——4、SQL优化技巧
77 0
|
1月前
|
存储 SQL 关系型数据库
三高Mysql - Mysql索引和查询优化讲解(偏理论部分)
三高Mysql - Mysql索引和查询优化讲解(偏理论部分)
61 0
|
10月前
|
存储 算法 关系型数据库
第10章 索引优化与查询优化【2.索引及调优篇】【MySQL高级】3
第10章 索引优化与查询优化【2.索引及调优篇】【MySQL高级】3
140 0
|
1月前
|
SQL 缓存 关系型数据库
MySQL调优之关联查询、子查询优化
MySQL调优之关联查询、子查询优化
510 0
|
13天前
|
SQL 关系型数据库 MySQL
从理论到实践,Mysql查询优化剖析(联表查询)
从理论到实践,Mysql查询优化剖析(联表查询)
24 0
|
1月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
MySQL 查询优化:提速查询效率的13大秘籍(索引设计、查询优化、缓存策略、子查询优化以及定期表分析和优化)(中)
111 0
|
2天前
|
SQL 关系型数据库 MySQL
MySQL性能优化实战:从索引策略到查询优化
MySQL性能优化聚焦索引策略和查询优化。创建索引如`CREATE INDEX idx_user_id ON users(user_id)`可加速检索;复合索引考虑字段顺序,如`idx_name ON users(last_name, first_name)`。使用`EXPLAIN`分析查询效率,避免全表扫描和大量`OFFSET`。通过子查询优化分页,如LIMIT配合内部排序。定期审查和调整策略以提升响应速度和降低资源消耗。【6月更文挑战第22天】
88 2
|
21天前
|
存储 关系型数据库 MySQL
Mysql查询优化
Mysql查询优化
19 1