MySQL 性能调优简介 温铭  金山互联网安全公司 安全技术研发中心
哪里可以调优 <ul><li>MySQL  配置参数 </li></ul><ul><li>索引 </li></ul><ul><li>操作系统 / 硬件 </li></ul><ul><li>应用 </li></ul><ul><li>SQL 语句 ...
MySQL 配置参数 <ul><li>使用 Innodb 引擎,而不是 MyISAM </li></ul><ul><li>--- 行锁;事务; </li></ul><ul><li>参数的调优对 Innodb 非常重要 </li></ul><ul...
innodb_buffer_pool_size <ul><li>最重要的参数 </li></ul><ul><li>缓存 Innodb 的索引和数据 </li></ul><ul><li>--- 根据你的数据量来分配,太大就浪费 </li></ul...
innodb_log_file_szie <ul><li>对写操作频繁的数据库很重要 </li></ul><ul><li>更大的日志文件  =  更少的数据刷新 </li></ul><ul><li>更大的日志文件  =  更长的恢复时间 </l...
innodb_flush_log_at_trx_commit <ul><li>看应用的要求 </li></ul><ul><li>1 :默认值,最安全。每个事务提交时不仅会写到日志,也会刷新到磁盘。即使停电也不会丢失数据 </li></ul><u...
innodb_flush_method <ul><li>Innodb 刷新数据到磁盘的方法 </li></ul><ul><li>默认是 fsync() </li></ul><ul><li>--- 操作系统和数据库会缓存两份数据 (double ...
其他重要参数 <ul><li>skip-name-resolve </li></ul><ul><li>interactive_timeout </li></ul><ul><li>default-character-set </li></ul><...
索引 <ul><li>Clustered Primary   Key </li></ul><ul><li>Secondary Index </li></ul>
索引 <ul><li>主键占用空间越小越好 </li></ul><ul><li>不要用随机值做主键。比如 MD5 </li></ul><ul><li>根据主键查询速度最快 </li></ul><ul><li>联合索引 </li></ul><ul...
字段 <ul><li>考虑扩充的情况下用最省的类型 </li></ul><ul><li>---bool or int ; char() or varchar(); </li></ul><ul><li>ip 类型 </li></ul><ul><l...
操作系统 / 硬件 <ul><li>Linux 最常见,熟悉的人多,好维护 </li></ul><ul><li>sun 的 Solaris 和服务器对 MySQL 有专门的优化 </li></ul><ul><li>选择最新的稳定版本 </li>...
操作系统 / 硬件 <ul><li>内存:越多越好! </li></ul><ul><li>--- 优化数据库最廉价有效的方案 </li></ul><ul><li>更快的 CPU </li></ul><ul><li>UPS </li></ul><...
应用 <ul><li>数据库只负责数据,不管逻辑 </li></ul><ul><li>谨慎使用存储过程和触发器 </li></ul><ul><li>缓存,还是缓存,缓存是第一位的 </li></ul><ul><li>避免硬盘操作 </li></...
应用 <ul><li>把复杂的判断和逻辑留给代码,而不是数据库 </li></ul><ul><li>key-value database </li></ul><ul><li>---Tokyo Cabinet/Tyrant ; MongDB ; ...
SQL 语句 <ul><li>如果你一眼看不明白这个 SQL 语句是干嘛的,就重写吧 </li></ul><ul><li>explain 每一个 SQL 语句,确认是否用到索引 </li></ul><ul><li>--- select * fr...
持续优化必备工具 <ul><li>Maatkit (mk)   :  a collection of 20+ scripts  </li></ul><ul><li>Hack MySQL Kit (hmk) </li></ul>
最好的提高方法 <ul><li>官方文档 </li></ul><ul><li>高质量 blog 集合: http://planet.mysql.com/ </li></ul><ul><li>http://hackmysql.com/ </li>...
DBA 还做了哪些? <ul><li>!!!备份!!! </li></ul><ul><li>持续优化 </li></ul><ul><li>安全和稳定 </li></ul><ul><li>异常处理 </li></ul><ul><li>灾难恢复 <...
<ul><li>Q&A </li></ul>
Upcoming SlideShare
Loading in...5
×

MySQL调优

1,563

Published on

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,563
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
84
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide

MySQL调优

  1. 1. MySQL 性能调优简介 温铭 金山互联网安全公司 安全技术研发中心
  2. 2. 哪里可以调优 <ul><li>MySQL 配置参数 </li></ul><ul><li>索引 </li></ul><ul><li>操作系统 / 硬件 </li></ul><ul><li>应用 </li></ul><ul><li>SQL 语句 </li></ul>
  3. 3. MySQL 配置参数 <ul><li>使用 Innodb 引擎,而不是 MyISAM </li></ul><ul><li>--- 行锁;事务; </li></ul><ul><li>参数的调优对 Innodb 非常重要 </li></ul><ul><li>--- 默认参数性能很差 </li></ul><ul><li>Innodb 不会对参数做任何自我优化 </li></ul>
  4. 4. innodb_buffer_pool_size <ul><li>最重要的参数 </li></ul><ul><li>缓存 Innodb 的索引和数据 </li></ul><ul><li>--- 根据你的数据量来分配,太大就浪费 </li></ul><ul><li>可以设置为物理内存的 80% </li></ul><ul><li>--- 要给操作系统和其他缓存留有足够的内存,不然会有内存竞争 </li></ul><ul><li>负载过重时, Innodb 分配的值可能会多 10% </li></ul>
  5. 5. innodb_log_file_szie <ul><li>对写操作频繁的数据库很重要 </li></ul><ul><li>更大的日志文件 = 更少的数据刷新 </li></ul><ul><li>更大的日志文件 = 更长的恢复时间 </li></ul><ul><li>怎么选择合适自己应用的值? </li></ul><ul><li>---innodb_log_buffer_size 设置为每秒的数据量, innodb_log_file_size 设置为半个小时的数据量(因为默认有两个日志文件) </li></ul><ul><li>--- 怎么确定每秒数据量见这里 </li></ul>
  6. 6. innodb_flush_log_at_trx_commit <ul><li>看应用的要求 </li></ul><ul><li>1 :默认值,最安全。每个事务提交时不仅会写到日志,也会刷新到磁盘。即使停电也不会丢失数据 </li></ul><ul><li>0 :最不安全,效率最高。事务提交时不做任何操作,每秒钟刷新到日志和磁盘。数据库崩溃会丢失 1 秒的事务 </li></ul><ul><li>2 :每个事务提交时写到日志,每秒刷新到磁盘一次。系统崩溃会丢失 1 秒的事务 </li></ul>
  7. 7. innodb_flush_method <ul><li>Innodb 刷新数据到磁盘的方法 </li></ul><ul><li>默认是 fsync() </li></ul><ul><li>--- 操作系统和数据库会缓存两份数据 (double buffering) </li></ul><ul><li>O_DIRECT </li></ul><ul><li>--- 绕过操作系统的缓存 </li></ul><ul><li>--- 如果是大量随机写入操作, O_DIRECT 会提高效率。但是顺序写入和读取效率都会降低。所以使用 O_DIRECT 需要根据需求测试。可以看一下 taobao DBA 团队的一个小测试 </li></ul>
  8. 8. 其他重要参数 <ul><li>skip-name-resolve </li></ul><ul><li>interactive_timeout </li></ul><ul><li>default-character-set </li></ul><ul><li>max_connections </li></ul><ul><li>thread_concurrency </li></ul>
  9. 9. 索引 <ul><li>Clustered Primary Key </li></ul><ul><li>Secondary Index </li></ul>
  10. 10. 索引 <ul><li>主键占用空间越小越好 </li></ul><ul><li>不要用随机值做主键。比如 MD5 </li></ul><ul><li>根据主键查询速度最快 </li></ul><ul><li>联合索引 </li></ul><ul><li>--- 最左前缀 </li></ul><ul><li>不做不必要的索引 </li></ul><ul><li>--- 空间;时间;缓存 </li></ul><ul><li>只有几个值的字段不必索引 </li></ul>
  11. 11. 字段 <ul><li>考虑扩充的情况下用最省的类型 </li></ul><ul><li>---bool or int ; char() or varchar(); </li></ul><ul><li>ip 类型 </li></ul><ul><li>---inet_aton 和 inet_ntoa 函数 </li></ul><ul><li>命名规范 </li></ul><ul><li>表的设计。范式,反范式 </li></ul>
  12. 12. 操作系统 / 硬件 <ul><li>Linux 最常见,熟悉的人多,好维护 </li></ul><ul><li>sun 的 Solaris 和服务器对 MySQL 有专门的优化 </li></ul><ul><li>选择最新的稳定版本 </li></ul><ul><li>--- 优化;硬件支持; </li></ul><ul><li>文件系统: XFS </li></ul><ul><li>当然,要支持 64 位 </li></ul>
  13. 13. 操作系统 / 硬件 <ul><li>内存:越多越好! </li></ul><ul><li>--- 优化数据库最廉价有效的方案 </li></ul><ul><li>更快的 CPU </li></ul><ul><li>UPS </li></ul><ul><li>有 BBU( 电池备份单元 ) 的 Raid 卡 </li></ul><ul><li>RAID10 </li></ul><ul><li>硬盘 </li></ul><ul><li>--- 优化完参数后,提高性能最显著的方法 </li></ul>
  14. 14. 应用 <ul><li>数据库只负责数据,不管逻辑 </li></ul><ul><li>谨慎使用存储过程和触发器 </li></ul><ul><li>缓存,还是缓存,缓存是第一位的 </li></ul><ul><li>避免硬盘操作 </li></ul><ul><li>统计 </li></ul><ul><li>读写分离 ?MySQL proxy... </li></ul>
  15. 15. 应用 <ul><li>把复杂的判断和逻辑留给代码,而不是数据库 </li></ul><ul><li>key-value database </li></ul><ul><li>---Tokyo Cabinet/Tyrant ; MongDB ; MemcacheDB... </li></ul><ul><li>数据库不是救世主,不是存储系统,更不是垃圾桶 </li></ul>
  16. 16. SQL 语句 <ul><li>如果你一眼看不明白这个 SQL 语句是干嘛的,就重写吧 </li></ul><ul><li>explain 每一个 SQL 语句,确认是否用到索引 </li></ul><ul><li>--- select * from table where date(create_time) > '2009-1-1' </li></ul><ul><li>不要在 innodb 引擎的表上使用 count(*) </li></ul><ul><li>批量 insert 和 update </li></ul><ul><li>开启慢查询日志,把超过一秒的操作拉出来示众 </li></ul>
  17. 17. 持续优化必备工具 <ul><li>Maatkit (mk) : a collection of 20+ scripts </li></ul><ul><li>Hack MySQL Kit (hmk) </li></ul>
  18. 18. 最好的提高方法 <ul><li>官方文档 </li></ul><ul><li>高质量 blog 集合: http://planet.mysql.com/ </li></ul><ul><li>http://hackmysql.com/ </li></ul>
  19. 19. DBA 还做了哪些? <ul><li>!!!备份!!! </li></ul><ul><li>持续优化 </li></ul><ul><li>安全和稳定 </li></ul><ul><li>异常处理 </li></ul><ul><li>灾难恢复 </li></ul><ul><li>设计 </li></ul><ul><li>审查 </li></ul>
  20. 20. <ul><li>Q&A </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×