1. 索引优化
-
合理创建索引:为高频查询条件、JOIN字段、排序字段创建索引
-
复合索引设计:遵循最左前缀原则,将选择性高的列放在前面
-
避免索引失效:防止索引列上使用函数、类型转换、OR条件不当使用
-
覆盖索引:尽量让查询只需通过索引就能获取所需数据
2. 查询语句优化
-
**避免SELECT ***:只查询需要的列,减少数据传输量
-
优化WHERE子句:将过滤性强的条件放在前面
-
避免使用!=或<>操作符:这类操作通常无法使用索引
-
慎用OR:考虑改用UNION ALL或IN替代
3. JOIN优化
-
小表驱动大表:遵循小表JOIN大表的原则
-
合理使用JOIN类型:根据业务需求选择INNER/LEFT/RIGHT JOIN
-
确保JOIN字段有索引:特别是被驱动表的连接字段
-
避免多表JOIN:复杂JOIN可考虑拆分为多个简单查询
4. 排序和分组优化
-
为ORDER BY/GROUP BY字段建立索引:使排序能利用索引
-
减少排序数据量:先过滤再排序
-
优化filesort:适当增大sort_buffer_size
-
避免不必要的DISTINCT:评估是否真的需要去重
5. 子查询优化
-
用JOIN替代子查询:特别是相关子查询
-
使用EXISTS代替IN:当子查询结果集较大时
-
将子查询转化为派生表:有时能提高性能
6. 分页优化
-
避免大偏移量:使用WHERE id > last_id LIMIT n替代LIMIT m,n
-
使用覆盖索引:先通过索引获取ID,再JOIN获取完整数据
-
预计算分页信息:对静态数据可缓存分页结果
7. 数据类型优化
-
使用合适的数据类型:如用INT而非VARCHAR存储数字
-
避免NULL值:NULL会增加处理复杂度,考虑使用默认值
-
控制字段长度:特别是VARCHAR长度,够用即可
-
枚举类型优化:使用ENUM代替字符串类型
8. 事务优化
-
控制事务范围:避免长事务
-
合理设置隔离级别:根据业务需求选择最低可用隔离级别
-
批量操作:使用批量INSERT/UPDATE减少事务次数
-
避免死锁:按固定顺序访问多表
9. 表结构优化
-
合理分表:垂直分表(按列)和水平分表(按行)
-
使用合适存储引擎:InnoDB适合事务,MyISAM适合读多写少
-
规范化与反规范化平衡:根据查询需求适度反规范化
-
控制单表数据量:大数据量表考虑分区或分表
10. 服务器配置优化
-
调整缓冲池大小:合理设置innodb_buffer_pool_size
-
优化日志配置:平衡数据安全与性能
-
连接池配置:合理设置max_connections
-
定期维护:ANALYZE TABLE、OPTIMIZE TABLE等