MySQL 数据库的性能优化方法有哪些?

Sherwin.Wei Lv7

MySQL 数据库的性能优化方法有哪些?

回答重点

对开发而言,一般可以从 SQL 和库表设计两部分优化 MySQL 性能问题。

SQL 优化

根据慢 SQL 日志,找出需要优化的一些语句。

常见优化方向:

1)避免 SELECT *,只查询必要的字段

2)避免在 SQL 中进行函数计算等操作,使得无法命中索引

3)避免使用 %LIKE,导致全表扫描

4)注意联合索引需满足最左匹配原则

5)不要对无索引字段进行排序操作

6)连表查询需要注意不同字段的字符集是否一致,否则也会导致全表扫描

库表设计优化

1)合理的表结构:比如选择合适的数据类型,例如能用 int 的不要用 bigint,还有 varchar 和 char 的选择等等。

2)合理冗余字段:在适当的情况下进行反规范化设计,冗余部分数据,减少关联查询。

3)索引优化:根据查询频率和条件,创建合适的索引,删除不必要的索引,因为索引的维护也是需要成本的。建议使用 EXPLAIN 分析查询执行计划,确认是否用上索引,是否用对索引。

4)分库分表:对于超大规模的数据库系统,可以采用分库分表策略,将数据拆分到多个数据库或表中,提高读写性能和扩展性。

扩展:你们是怎么分库,怎么分表的?

扩展:如何使用 MySQL 的 EXPLAIN 语句进行查询分析?

扩展:MySQL 中 varchar 和 char 有什么区别?

扩展知识

MySQL 相关配置优化

可以根据具体的使用场景调整以下参数:

  • innodb_buffer_pool_size:增大 InnoDB 的缓冲池大小,一般设置为物理内存的 70-80%。
  • query_cache_size:适当调整查询缓存大小。
  • max_connections:增加最大连接数。
  • table_open_cache:增加打开表的缓存大小。
  • thread_cache_size:调整线程缓存大小以减少线程创建的开销。

硬件层面的优化

1)升级硬件:增加服务器的内存、CPU 和存储速度。(现在云厂商都支持不停服直接升级)

2)使用 SSD:相比传统的 HDD,SSD 读取和写入速度更快。

数据库维护

1)定期备份:保证数据安全,防止数据丢失。

2)定期清理:删除不必要的数据和日志,释放存储空间(例如历年的数据可以剥离存档,释放当前表的大小)。

3)重建索引:定期重建索引,保持索引的高效性。

4)分析表和优化表:定期运行 ANALYZE TABLE 和 OPTIMIZE TABLE,保持表的统计信息更新和碎片整理,使得优化器更加准确。

缓存

数据库始终是有瓶颈的,如果不论怎么优化性能上不去,此时可以考虑用缓存。在部分场景可以使用本地缓存和 Redis 分布式缓存减轻 MySQL 查询压力。

但是要关注缓存和数据库一致性问题。

扩展:如何保证缓存与数据库的数据一致性?

Comments