MySQL 性能提示

来源:互联网 发布:java 路由器端口扫描 编辑:程序博客网 时间:2024/04/28 14:25
 

这里罗列了一些基本的 MySQL 性能提示,但不是放之四海而皆准,需要根据实际的应用情况而决定。

【设计】

  1. 使用标准化设计(数据库三范式),记住表的联合查询(join)性能不会差
  2. 选择合适的字符集,虽然UTF16无所不能,但需要两倍的存储;UTF8适合各种字符,但比latin1慢,尽可能选用latin1(此条不适合中文)
  3. utf8_general_ci 略快于 utf8_unicode.ci
  4. 字段尽可能使用 NOT NULL
  5. 为所有的 SELECT 查询创建索引
  6. 索引提升查询的性能,但降低插入数据的性能,因此不要做无用的和重复的索引

【查询】

  1. 尽可能使用最小的数据类型,例如一些状态字段用 tinyint 而不是 int
  2. 尽可能避免 IN (…) 查询
  3. 尽可能避免 ORDER BY RAND() 查询
  4. 当你需要在一些唯一索引的表中插入数据前使用 SELECT 进行判断记录是否存在时,请使用 INSERT … ON DUPLICATE KEY UPDATE … 方法来替代.
  5. 如果你的应用需要经常写数据库,那么请使用 InnoDB 引擎,否则用 MyISAM,这里有一个比较的文章
  6. 不要在大表中使用 LIMIT xxxx1, xxxx2 ,特别是当 xxxx1 参数值特别大的时候,可尽量通过 WHERE 来限制结果集,然后使用 LIMIT xxxx2 方式.
  7. 不使用已被废弃的方法
  8. 避免在 LIKE 查询中使用 % 前缀,例如 LIKE '%oschina' ,这将使索引无效
  9. 如果有大量的数据需要一次性插入,最好对这些 INSERT 语句进行合并以便批量插入
  10. Prefer GROUP BY over DISTINCT.
  11. 经常浏览系统的慢查询日志 Slow Query Log.
  12. 避免在 WHERE … , LIMIT … , ORDER BY … 等语句中使用表达式和函数计算公式等。
  13. 使用 EXPLAIN … 对你的 SQL 查询进行分析,以便确认是否最优查询
  14. 不要使用 SELECT * … ,只 SELECT 你想要的字段(这点挺麻烦,在 ORM 世界里更是这样)
  15. 尽可能合并小查询为一个大查询

【存储引擎】

  1. 了解各种存储引擎的特点,并根据实际情况进行选择,选择之前在测试平台上做充分测试
  2. Archive old data such as logs in ARCHIVE tables or MERGE tables.
  3. BLACKHOLE 引擎非常快速,特别适用一些繁忙的事务,例如日志

【配置my.cnf】

  1. 提供默认的主键缓冲区大小: key_buffer = 128M
  2. 提高默认的打开表的缓存个数: table_cache = 128
  3. 提供默认的排序缓冲区大小:
    sort_buffer_size = 32M
    myisam_sort_buffer_size = 32M
  4. 如果不做复制的话,禁用二进制日志:# log-bin=mysql-bin
原创粉丝点击