当前位置:首页 > 技术文章 > 正文内容

mysql 数据库-sql调优

arlanguage1个月前 (03-29)技术文章20

一、基础入门篇:掌握调优核心原理

1.1 索引优化基础

黄金法则:80%的性能问题可通过索引优化解决

-- 创建复合索引的正确姿势 
CREATE INDEX idx_user_profile 
ON users(last_name, age, status)
COMMENT '覆盖最常用查询条件';
 
-- 查看索引使用情况 
SHOW INDEX FROM users;

三大索引原则

  1. 最左前缀原则(电梯理论:找3楼必须先经过1-2楼)
  2. 避免冗余索引(每个索引都是存储成本)
  3. 选择性原则(区分度高的字段在前)

1.2 基础查询优化技巧

-- 反面教材 
SELECT * FROM orders 
WHERE YEAR(create_time) = 2023;
 
-- 优化方案 
SELECT order_id, customer_name 
FROM orders 
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';

常见优化场景

  • 避免在WHERE子句使用函数操作(导致索引失效)
  • 用BETWEEN替代多个OR条件
  • LIMIT分页优化(避免OFFSET过大)

二、执行计划深度解析

2.1 EXPLAIN命令详解

EXPLAIN FORMAT=JSON 
SELECT u.name,  o.total  
FROM users u 
JOIN orders o ON u.id  = o.user_id  
WHERE u.city  = '上海' 
AND o.status  = 'COMPLETED';

关键指标解读

字段

优化指标

理想值

type

访问类型

const/ref/range

rows

预估扫描行数

越小越好

Extra

附加信息

Using index

filtered

条件过滤百分比

接近100%

2.2 JOIN优化策略

三种高性能JOIN方式

  1. 索引嵌套循环:确保关联字段有索引
  2. 批量Key访问:调整join_buffer_size
  3. 哈希连接:适用于无索引大表关联
-- 强制使用索引关联 
SELECT /*+ INDEX(o idx_user_id) */ 
u.name,  o.total  
FROM users u 
FORCE INDEX(PRIMARY)
JOIN orders o 
ON u.id  = o.user_id; 

三、系统级优化方案

3.1 配置参数调优

# my.cnf 核心参数配置 
[mysqld]
innodb_buffer_pool_size = 80%物理内存  # 数据缓存池 
innodb_log_file_size = 4G             # 事务日志大小 
max_connections = 1000                # 最大连接数 
thread_cache_size = 100               # 线程缓存 

参数调整验证方法

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';
-- 计算命中率应>99%
命中率 = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100 

3.2 慢查询日志分析

全流程诊断方法

  1. 开启慢日志记录
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 1; # 超过1秒记录 
  1. 使用pt-query-digest分析
pt-query-digest /var/lib/mysql/slow.log  
  1. 解读Top SQL报告

四、专家级技巧:全链路优化实践

4.1 分布式架构下的优化

读写分离架构

graph TD 
A[应用层] --> B[读写分离中间件]
B --> C[Master写节点]
B --> D[Slave读节点1]
B --> E[Slave读节点2]

分库分表策略

  • 垂直拆分:按业务模块拆分(用户库、订单库)
  • 水平拆分:按哈希或范围分片

4.2 高级索引策略

索引合并优化

-- 启用索引合并 
SET optimizer_switch = 'index_merge=on';
 
-- 查看合并情况 
EXPLAIN 
SELECT * FROM users 
WHERE phone = '13800138000' 
OR email = 'admin@example.com'; 

虚拟列索引(MySQL 8.0+):

ALTER TABLE products 
ADD COLUMN name_price VARCHAR(100) 
GENERATED ALWAYS AS (CONCAT(name, '-', price));
 
CREATE INDEX idx_comp ON products(name_price);

五、调优工具箱推荐

工具名称

用途

使用场景

Percona Toolkit

专业诊断工具集

死锁分析/表结构优化

mysqldumpslow

慢查询日志分析

快速定位问题SQL

Performance Schema

实时性能监控

深度分析服务器状态

pt-visual-explain

可视化执行计划

团队演示与方案评审

调优检查清单

  • 所有查询都使用索引覆盖
  • 没有出现全表扫描(type=ALL)
  • JOIN操作使用最佳关联方式
  • 事务隔离级别设置合理(通常RR/RC)
  • 定期进行索引碎片整理

通过这三个层次的优化,可使MySQL性能提升5-10倍。记住:调优是持续过程,需结合监控系统定期review,随着数据增长动态调整方案。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/3670.html

分享给朋友:

“mysql 数据库-sql调优” 的相关文章

Linux新手入门系列:安装nginx

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:Linux下区分大小写;Linux多用户多线程;Linux下每个文件和目录都有访问权限;安装nginx...

nginx location 多root理解location

由于应用需求,这个 r 目录需要单独拉出来做处理,nginx 最开始是这样写的: server { root /home/webadm/htdocs; index index.php; location /r/ { root /diska/htdocs; } location ~ \.php { f...

docker安装php

本节将介绍在线使用Docker安装PHP解析器的步骤。通过本节的实操,您可以掌握从Docker环境的使用,PHP镜像以及Nginx服务器的拉取、导入、容器的启动的全部过程,从而具备使用Docker安装并部署PHP与ngninx的能力。本节要求您具备的基本能力有Linux,Docker,以及nginx...

Nginx缓存设置教程

这篇文章主要介绍了Nginx缓存设置案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下在开发调试web的时候,经常会碰到因浏览器缓存(cache)而经常要去清空缓存或者强制刷新来测试的烦恼,提供下apache不缓存配置和nginx不缓存配置的设置。在...

08《Nginx 入门教程》Nginx 的 Http 模块介绍(中)

在前面介绍完 post-read、server-rewrite、find-config、rewrite 和 post-rewrite 阶段后,我们将继续学习 preaccess 和 access 两个阶段,中间会涉及部分模块,一同进行说明。1. preaccess 阶段在 preaccess 阶段在...

在AWS上组合使用ELB和Nginx Plus获得更多特性

使用AWS的客户经常问我们,对于负载均衡,到底是使用AWS的ELB还是Nginx Plus?Amazon曾经发布了一个白皮书来说明如何在AWS上配置Nginx Plus。本文将聚焦在选择Nginx Plus或者ELB时需要考虑的因素方面,也会讨论一些更适合于组合使用Nginx Plus和ELB的情形...