慢SQL优化分析思路
最后更新于
最后更新于
【好像不错,只是简单看了看】
调优流程:
SHOW STATUS观察服务器状态,是否存在周期性波动;如果存在就缓存优化减少缓存失效;
如果还存在不规则延迟或卡顿的话,就开启慢查询、explain分析查询语句;
如果发现sql等待时间长,就调优服务器参数;如果发现sql执行时间长,就索引优化、表优化;
如果还存在不规则延迟或卡顿的话,就观察sql查询是否到瓶颈了;是的话就读写分离、分库分表。
三种分析工具(SQL调优三步骤):慢查询、EXPLAN、SHOW PROFLING排查:开启慢查询日志set global slow query log='ON';
再通过一些工具比如mysqldumpslow去分析对应的慢查询日志sql 执行时间长的解决办法:
避免select *
索引优化
覆盖索引,减少回表
前缀索引(邮箱)
使用联合索引,注意最左匹配原则
避免索引失效:避免用!=/<>/函数运算
JOIN优化
用JOIN代替子查询,减少临时表的创建
小表驱动大表,减少连接建立次数
适当增加冗余字段,减少表关联查询,空间换时间
表结构优化
索引、查询语句的编码设计
尽量避免使用 SELECT *,只查询需要的列。
优化索引:包括主键索引、唯一索引、普通索引和联合索引等,使用覆盖索引。
减少索引失效:避免在查询条件中对索引列使用函数、运算符等,确保索引生效。
字段动静分离:将经常修改的字段与不常变动的字段分开存储,减少锁冲突,提高并发性能。
使用 JOIN 代替子查询,减少嵌套查询的层次。
分页查询优化:对于大表的分页查询,尽量避免 OFFSET
大的情况,使用基于索引的优化分页方案。
存储引擎选择:现代MySQL版本中InnoDB是默认存储引擎,支持事务、行级锁定和外键,适合大多数应用场景。虽然MyISAM性能高于InnoDB,但缺乏事务支持和行级锁。
配置 MySQL优化: 增大InnoDB缓冲池(innodb_buffer_pool_size
),提高缓存命中率,减少磁盘I/O;增加最大连接数(max_connections
),避免高并发场景下连接数不足的情况,但需确保服务器资源足够。
架构优化:
读写分离:通过主从复制实现读写分离,将读操作分散到多个从服务器上,减轻主服务器的负载。
数据库分片(水平分库/垂直分库):将大型数据库拆分成多个小型数据库,每个数据库包含部分数据。通过分片可以提高数据库的扩展性和查询性能。
分布式数据库:例如 TiDB、ES。【cue 项目】
使用缓存:如 Caffine、Redis 等,减少对数据库的直接访问次数。【cue 项目】
硬件层优化:
选择高性能的 CPU
增加内存容量: MySQL 使用大量内存来缓存数据和索引
使用高速磁盘:如 SSD(固态硬盘)减少 I/O 等待时间。用 RAID 技术来提高磁盘读写性能和可靠性。
高性能需求:选择RAID 0 或RAID 10。
高可靠性需求:选择RAID 1、RAID 5、RAID 6或RAID 10。
优化网络配置:配置 QoS 以优先处理数据库流量、负载均衡、调整 TCP 窗口大小
sql现场事故:【这里可以cue测试的重要性】数据量40w+两台服务器改了一台的索引,没改另外一台,导致索引失效,查询速度缓慢,最后无法登录线上数据库不能乱动,一定要做好记录,做好备份 mysql单表1亿,查询慢,怎么优化分库分表、缓存、还有查询语句的优化吧
或者参考: