MySQL调优方法总结
23 September 2014
数据库设计方面
- 适度的反范式
第三范式是肯定需要遵守的,尤其是OLTP型数据库。
但是第三范式也有缺点:查询时经常需要大量的Join
,导致查询效率不高。
所以有时候为了性能的考虑,适度的违反第三范式,做适当的冗余设计。
OLTP,联机事务处理,可以理解为关系型数据库。
OLAP,联机分析处理,可以理解为数据仓库。
- 适当建立索引
索引的字段必须是经常作为查询条件的字段,因为查询速度的提高是以更新、创建、删除的性能为代价的。
索引字段要有足够的区分度。
联合索引的第一项必须要有,第二项才能生效。
支持前缀索引。
关于索引方面的知识有很多,这里就先不展开了。
- 对表进行水平切分
好的水平切分,有利于程序的实现,也能充分利用到水平分表的优势。
比如数据条数很多,上千万级别,而且系统界面中只提供按月份进行查询,那么就可以考虑将大表水平拆分为12个表。
- 对表进行垂直切分
如果表的字段非常多,会占用大量的空间,检索表时需要执行大量I/O,影响性能。这时可以把一些字段切分到另一个表,新表和旧表是一对一映射。如果有些字段不常用又很长,那更应该拆分出去。
- 选择适当的字段类型
主键用自增,timestamp只用4字节而datetime用8字节
文件、图片存储在文件系统中,数据库中只保存路径。
外键要表示清楚,这样可以方便建立索引。
- 选择合适的存储引擎
innodb、myisam、memory等。
关于innodb会在另外文章里详细说明。
SQL语句优化
要善于利用工具:慢查询日志slow query log
slow_query_log = xxx.txt
long_query_time=2
这就可以记录执行超过2秒的语句。
知道是哪些语句慢了之后,可以通过explain
来分析执行计划。
- 用集中批量操作代替频繁读写
这样可以减少IO。
数据库参数配置
最主要的参数是调整内存。
可以用show status
看状态,然后确定内存大小。
合理的硬件资源和操作系统
如果内存超过4G,要使用64位OS和64位MySQL。
- 读写分离
master-slave架构,从多台slave读数据,向一台master写入数据。
业界有amobe可以作为数据库中间件。
-EOF-