有很多人都问过我如何优化 MySQL,苦于自己一直没有好好总结,总是不能有条理的讲出来,今天就来总结一下.
安装和配置
如果没有充分的理由请不要自己动手编译 MySQL,官网上提供的编译好的包就够用了, MySQL 文档中提出用 ICC 编译的 MySQL 性能要优于用 GCC 编译的.如果你的服务器是 Intel 架构,请下载用 ICC 编译的包.安装好了肯定是要做一些配置的,我通常都是用 MyISAM 表引擎的,所以只总结关于 MyISAM 的配置优化.MyISAM 主要有以下参数需要注意:
- query_cache,开启 query_cache,MySQL 会缓存 SELECT 查询语句和查询结果,当遇到相同的查询语句时不用解析查询语句而直接返回查询结果.query_cache 在互联网应用中有不错的表现.
- key_buffer_size,这个选项指定索引的缓冲区大小,适当增加这个选项的值会得到更好的索引处理性能.
- sort_buffer_size,这个选项指定用于排序的缓冲区大小,适当增加这个选项可以提高 ORDER BY 和 GROUP BY 的效率.
- read_buffer_size,这个选项指定扫描表时的缓冲区大小.
最后别忘记开启慢查询日志和没有使用索引的查询日志,这些日志在改善查询性能非常重要.
设计数据库/表
这绝对是个相当重要的环节,在开发过程中发现数据库设计不合理再返工绝对是要命的.MySQL 非常善于处理数字类型字段和固定长度类型字段,单表记录大于千万时性能表现不佳.所以我们设计数据库时最好遵循下面几条原则:
- 主键/唯一键/ORDER BY 字段/GROUP BY 字段使用数字类型字段
- 除非有必要,否则数字类型字段请用无符号数字类型
- 除非有必要,否则字符串类型字段请用 latin1_bin 编码方式
- 权衡选择固定长度类型和可变长度类型
- 预估一个表的记录数和字段数目,如有必要请横向/纵向拆分表
- 不要给字段设置 NULL 值
- 建立必要的索引
设计 SQL
很多开发人员觉得能写出很复杂,很酷的 SQL 是一件值得骄傲的事情,这里我要说的是”醒悟吧,孩子”.尽量用最简单的 SQL 来完成任务,如果你的 SQL 不能写的简单,那说明你的数据库设计的不合理.设计 SQL 也有一些原则:
- SQL 只查询需要的记录的行/列
- 不要在列上作计算,数据库不是做计算用的,请在程序里想办法
- 尽量不要用 GROUP BY 和 JOIN
- 查询尽量能用到索引
在生产环境中观察
项目上线了,真正的烦恼才刚刚开始.MySQL 既然记录了日志,就经常看看,看看哪些 SQL 执行慢,哪些 SQL 没有使用索引.拿到这些 SQL 后可以用 phpMyAdmin 里的 profile 功能来分析其执行情况.
使用缓存机制
所有的大中型网站都不会直接用数据库扛所有的压力,为了减轻数据库压力必定要使用缓存机制,有些人也使用 MySQL 的 Master-Slave 架构来分散数据库压力,但是数据不能及时同步的情况时有发生.手机之家 自主研发了一款中间件 DAL(Data Access Layer) 来解决访问数据库遇到的诸多问题,关于 DAL 的详细内容请看 超前博客.
数据库优化是个很大的话题,涉及的内容也是很多很多,本文只是对笔者日常工作的总结,如果你有更多,更好的想法请给我留言.非常感谢!