MySQL 性能提示

红薯 发布于 2011/03/13 22:23
阅读 964
收藏 41

这里罗列了一些基本的 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

本文译自:http://www.kavoir.com/2011/03/mysql-performance-tips.html

加载中
0
Orion
Orion

能不能讲的深一点呢 比如为什么 这样觉得更有用

0
红薯
红薯

引用来自#2楼“Orion”的帖子

能不能讲的深一点呢 比如为什么 这样觉得更有用

那就太深了,估计讲一学期课也讲不完,这个真不会,呵呵

0
黑仔-_-
黑仔-_-

学习了...

0
G.
G.

15.尽可能合并小查询为一个大查询.

-----

我不同意这一条, 特别是在一个很忙的数据库服务器上.

因为一条"大的查询", 意味着要占用较多的资源, 特别是"锁"资源.

如果是MyISAM这类"表锁"级别的引擎上. 等待"锁"资源是不可避免的事情.而正在等待的进程本身也占用了大量的其它资源.

万一真的发生这样的事情, 那你只能等着"雪崩"吧.

我曾经发生过这样的事情.  数据库一启动就死掉了. 联接数有增无减...

0
MasterAndy
MasterAndy

数据库三范式  还是刚刚谢谢SQLServer 老师将的...

汗  现在都忘记了 

不过还是不太明白 

0
mark35
mark35

引用来自#2楼“Orion”的帖子

能不能讲的深一点呢 比如为什么 这样觉得更有用

普通应用没什么大效果,改改my.cnf合理调整缓存内存参数有较好效果。你费心学了不少绝世独门招数,mysql一犯傻就什么都不管用了。

看看红薯的遭遇 :

MySQL 5.5 复合主键的索引问题  http://www.oschina.net/bbs/thread/9626

还有这个:

MySQL大战SQLite(PostgreSQL强势乱入) http://obmem.info/?p=493

所以就拿mysql当玩具练手吧,尽量学SQL标准的东西,等入门后再考虑向上发展钻研pgsql,oracle,db2等可以生产用的DB~

返回顶部
顶部