MySQL 性能提示
这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定。
【设计】
引用
1.使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差
选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;
2.UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文)
3.utf8_general_ci 略快于 utf8_unicode.ci
4.字段尽可能使用 NOT NULL
5.为所有的 SELECT 查询创建索引
索引提升查询的性能,但降低插入数据的性能,因此不要做无用的和重复的索引
【查询】
引用
尽可能使用最小的数据类型,例如一些状态字段用 tinyint 而不是 int
尽可能避免 IN (…) 查询
尽可能避免 ORDER BY RAND() 查询
当你需要在一些唯一索引的表中插入数据前使用 SELECT 进行判断记录是否存在时,请使用 INSERT … ON DUPLICATE KEY UPDATE … 方法来替代.
如果你的应用需要经常写数据库,那么请使用 InnoDB 引擎,否则用 MyISAM,这里有一个比较的文章。
不要在大表中使用 LIMIT xxxx1, xxxx2 ,特别是当 xxxx1 参数值特别大的时候,可尽量通过 WHERE 来限制结果集,然后使用 LIMIT xxxx2 方式.
不使用已被废弃的方法
避免在 LIKE 查询中使用 % 前缀,例如 LIKE '%oschina' ,这将使索引无效
如果有大量的数据需要一次性插入,最好对这些 INSERT 语句进行合并以便批量插入
Prefer GROUP BY over DISTINCT.
经常浏览系统的慢查询日志 Slow Query Log.
避免在 WHERE … , LIMIT … , ORDER BY … 等语句中使用表达式和函数计算公式等。
使用 EXPLAIN … 对你的 SQL 查询进行分析,以便确认是否最优查询
不要使用 SELECT * … ,只 SELECT 你想要的字段(这点挺麻烦,在 ORM 世界里更是这样)
尽可能合并小查询为一个大查询
【存储引擎】
引用
了解各种存储引擎的特点,并根据实际情况进行选择,选择之前在测试平台上做充分测试
Archive old data such as logs in ARCHIVE tables or MERGE tables.
BLACKHOLE 引擎非常快速,特别适用一些繁忙的事务,例如日志
【配置my.cnf】
引用
提供默认的主键缓冲区大小: key_buffer = 128M
提高默认的打开表的缓存个数: table_cache = 128
提供默认的排序缓冲区大小:
sort_buffer_size = 32M
myisam_sort_buffer_size = 32M
如果不做复制的话,禁用二进制日志:# log-bin=mysql-bin