跳转至
用户认证 - eMac Tech Docs

用户认证

重要提醒

为了您的权益以及学习体验,请不要外借账号!

如果您没有账号或忘记密码,请联系管理员重置密码。

请输入您的登录信息

MySQL查询优化

查询优化概述

1. 什么是查询优化

Syntax error in textmermaid version 11.6.0

查询优化是通过改进查询语句和数据库结构来提高查询效率的过程。

2. 查询优化的目标

  • 提高查询速度
  • 减少资源消耗
  • 提高并发能力
  • 优化用户体验

查询优化方法

1. 索引优化

方法 说明 示例
使用索引 避免全表扫描 ALTER TABLE users ADD INDEX idx_name(name)
覆盖索引 减少回表操作 SELECT id,name FROM users WHERE name='John'
复合索引 优化多条件查询 CREATE INDEX idx_name_age ON users(name,age)
前缀索引 减少索引大小 ALTER TABLE users ADD INDEX idx_email(email(20))

2. SQL语句优化

-- 优化前
SELECT * FROM orders WHERE user_id = 100;

-- 优化后
SELECT id, order_no, amount 
FROM orders 
WHERE user_id = 100;

-- 优化前
SELECT * FROM products 
WHERE price > 100 
ORDER BY create_time DESC;

-- 优化后
SELECT id, name, price 
FROM products 
WHERE price > 100 
ORDER BY create_time DESC 
LIMIT 20;

3. 表结构优化

-- 优化前
CREATE TABLE logs (
    id INT,
    content TEXT,
    create_time DATETIME
);

-- 优化后
CREATE TABLE logs (
    id INT PRIMARY KEY,
    content VARCHAR(1000),
    create_time TIMESTAMP,
    INDEX idx_create_time(create_time)
);

查询分析工具

1. EXPLAIN分析

-- 查看执行计划
EXPLAIN SELECT * FROM orders WHERE user_id = 100;

-- 查看详细执行计划
EXPLAIN FORMAT=JSON SELECT * FROM orders WHERE user_id = 100;

2. 性能分析

-- 查看慢查询日志
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 查看进程列表
SHOW PROCESSLIST;

-- 查看表状态
SHOW TABLE STATUS LIKE 'orders';

查询优化最佳实践

1. 索引使用原则

  • 最左前缀原则
  • 选择性原则
  • 覆盖索引原则
  • 索引列数限制

2. SQL编写原则

  • 只查询需要的列
  • 避免使用SELECT *
  • 使用LIMIT限制结果集
  • 避免使用函数运算

3. 表设计原则

  • 选择合适的数据类型
  • 控制字段长度
  • 合理使用NULL
  • 适当冗余设计

常见优化场景

1. 分页查询优化

-- 优化前
SELECT * FROM orders 
ORDER BY create_time DESC 
LIMIT 10000, 20;

-- 优化后
SELECT * FROM orders 
WHERE create_time < '2023-01-01' 
ORDER BY create_time DESC 
LIMIT 20;

2. JOIN查询优化

-- 优化前
SELECT * FROM orders o 
JOIN users u ON o.user_id = u.id 
WHERE o.status = 'paid';

-- 优化后
SELECT o.id, o.order_no, u.name 
FROM orders o 
JOIN users u ON o.user_id = u.id 
WHERE o.status = 'paid';

3. 子查询优化

-- 优化前
SELECT * FROM orders 
WHERE user_id IN (
    SELECT id FROM users 
    WHERE status = 'active'
);

-- 优化后
SELECT o.* FROM orders o 
JOIN users u ON o.user_id = u.id 
WHERE u.status = 'active';

注意事项

  1. 性能监控

    • 慢查询日志
    • 执行计划分析
    • 系统资源监控
    • 性能指标跟踪
  2. 优化建议

    • 定期优化表
    • 更新统计信息
    • 清理无用索引
    • 维护数据分布
  3. 运维管理

    • 监控告警
    • 性能分析
    • 容量规划
    • 故障处理
  4. 重要参数

    • innodb_buffer_pool_size
    • innodb_log_file_size
    • max_connections
    • query_cache_size