当前位置: 首页 > news >正文

MySQL SELECT 查询性能优化指南

1. 索引优化

1.1 正确使用索引

  • 在WHERE和ORDER BY涉及的列上建立索引
  • 使用复合索引时遵循最左前缀原则
  • 避免在索引列上使用函数或运算,会导致索引失效
-- 好的做法
SELECT * FROM users WHERE username = 'john';  -- username有索引
-- 不好的做法
SELECT * FROM users WHERE UPPER(username) = 'JOHN';  -- 函数导致索引失效

1.2 避免索引失效的情况

  • 避免使用SELECT *
  • 避免使用!=或<>操作符
  • 避免在字段开头使用通配符(like ‘%abc’)
  • 避免对索引字段进行运算

2. 查询优化

2.1 限制结果集大小

-- 使用 LIMIT 限制返回行数
SELECT * FROM large_table LIMIT 100;

-- 分页查询优化
SELECT * FROM large_table WHERE id > last_id LIMIT 20;  -- 比 OFFSET 效率高

2.2 只查询需要的列

-- 好的做法
SELECT id, name FROM users;
-- 避免
SELECT * FROM users;

2.3 使用覆盖索引

  • 尽量使查询的列都在索引中,避免回表查询
-- 假设有索引(name, age)
SELECT name, age FROM users WHERE name = 'John';  -- 使用覆盖索引

3. JOIN优化

3.1 JOIN优化策略

  • 小表驱动大表
  • 在关联字段上建立索引
  • 使用INNER JOIN代替LEFT JOIN(如果可能)
-- 好的做法
SELECT * FROM small_table s 
INNER JOIN large_table l ON s.id = l.small_id;

3.2 避免多表JOIN

  • 控制JOIN表的数量,一般不超过3个表
  • 考虑是否可以拆分成多个简单查询

4. WHERE子句优化

4.1 条件顺序

  • 将过滤性最强的条件放在最前面
  • 将索引列的条件放在前面
-- 好的做法
SELECT * FROM users 
WHERE status = 'active'  -- 高选择性
AND created_at > '2023-01-01';  -- 低选择性

4.2 避免OR操作

  • 使用OR可能导致索引失效
  • 考虑使用UNION ALL替代OR
-- 替代OR的写法
SELECT * FROM users WHERE status = 'active'
UNION ALL
SELECT * FROM users WHERE status = 'pending';

5. 其他优化技巧

5.1 使用EXPLAIN分析查询

EXPLAIN SELECT * FROM users WHERE status = 'active';

关注以下指标:

  • type:访问类型(const最好,ALL最差)
  • key:使用的索引
  • rows:扫描的行数

5.2 合理使用子查询

  • 尽量使用JOIN代替子查询
  • 必要时使用临时表存储中间结果

5.3 缓存优化

  • 使用应用层缓存(如Redis)
  • 缓存常用查询结果
  • 合理设置查询缓存大小

6. 配置优化

6.1 重要配置参数

  • innodb_buffer_pool_size:缓冲池大小
  • innodb_log_file_size:日志文件大小
  • max_connections:最大连接数

6.2 硬件优化

  • 使用SSD存储
  • 增加内存容量
  • 优化磁盘I/O配置

最佳实践总结

  1. 合理使用索引
  2. 只查询必要的数据
  3. 优化JOIN操作
  4. 定期使用EXPLAIN分析查询
  5. 进行查询语句重写
  6. 利用缓存机制
  7. 定期维护优化数据库配置

相关文章:

  • 批量将 Word 拆分成多个文件
  • [Vue warn]: Duplicate keys detected: ‘xxx‘. This may cause an update error.
  • RangeError: Maximum call stack size exceeded
  • P62 线程
  • React Native 0.76 升级后 APK 体积增大的原因及优化方案
  • Selenium 元素定位方法及最佳实践
  • 面试基础---分布式架构基础:CAP 理论与 BASE
  • DeepSeek大语言模型下几个常用术语
  • MySQL和Hive SQL 时间处理常用函数汇总
  • 字符串字典树-依依的瓶中信
  • 深度洞察!树莓集团南京产业园再布局的核心逻辑
  • 网络运维学习笔记(DeepSeek优化版) 013网工初级(HCIA-Datacom与CCNA-EI)ACL访问控制列表
  • 项目中同时使用Redis(lettuce)和Redisson的报错
  • 服务器带宽堵塞会对网站访问产生哪些影响?
  • 打破界限!家电行业3D数字化营销,线上线下无缝对接
  • Yashan DB 体系结构
  • 初识云计算
  • 【FastAPI】 AI场景快速学习指南
  • JS采集数据爬虫-Fetch API 和 XMLHttpRequest 有什么区别?
  • 影刀 RPA 实战开发阶段总结
  • 怎么在vk网站上做推广/重庆森林在线观看
  • 只做正品的网站/竞价推广哪里开户
  • 网站建设进程方案/关键字广告
  • 酒店网站建设策划方案/商业软文
  • 1000个免费邮箱账号/哈尔滨网络优化推广公司
  • 深圳高端网站定制公/百度公司官网首页