Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mysql tunning

mysql tunning

kenshin

June 06, 2013
Tweet

Other Decks in Programming

Transcript

  1. 配合上面的工具要能回答下面几个问题 •  I/O –  I/O负载是否高? iostat tps 每秒i/o请求次数 iostat %util

    一秒钟内有多少时间用于I/O操作 wa cpu平均等待IO的时间 –  主要是读还是写? iostat r/s , w/s很容易判断 –  是随机写还是顺序写? 顺序读写性能远高于随机读写 数据库文件涉及索引等内容,写入是随机写 binlog文件是顺序写
  2. •  Memory –  mem使用率是否过高?        很容易判断,free,top,vmstat –  mem用在了哪?

                       各种  buffer&cache,  后面再细讲 •  CPU –  CPU使用率是否过高? 很容易判断,top,vmstat –  什么进程占用cpu  top •  Network –  带宽? dstat,ifconfig –  谁占用的带宽? iftop、tcpdump
  3. 调优的过程也是一个寻找问题的过程 •  MySQL整体性能如何?瓶颈在哪? –  show status –  mysqlreport –  tuning-primer.sh

    •  系统中哪些查询最慢? –  mysqldumpslow -s c -t 10 /var/lib/mysql/slowquery.log 查看10条出现最多的慢查询 •  当前哪些进程正在操作数据库? –  Show processlist •  某个查询是否使用了索引?效率是否足够高? –  explain •  一个查询,时间都花在了哪? –  profiling 定位mysql的性能问题  
  4. •  Tips •  所有MySQL服务器调优的参数,都在my.cnf中设置。 •     所有参数的值都可以通过show variables查看  。 • 

    所有参数设置是否合理,都可以通过show status来判断。 也可以通过mysqlreport这样的工具帮助分析。 •  与性能相关的参数主要是log,以及各种buffer & cache  
  5. •  主要log •  Error log 默认打开 •  Binlog 一般都打开,增量备份和复制的基础 • 

    Slow query log 需要调优时打开 •  Query log 除非出于debug目的,否则肯定不开,I/O消耗严重 •  各类日志相关的参数中,性能相关主要是两项 –  Binlog -- sync_log –  log_slow_queries -- long_query_time log  
  6. Buffer & cache   Global buffer   query_cache   key_buffer

      innodb_buffer_pool   thread_cache_size   table_open_cache   Thread buffer   sort_buffer   join_buffer   read_buffer   read_rnd_buffer  
  7. •  查询缓存    -> query_cache •  MyISAM 索引缓存  -> key_buffer

    •  InnoDB缓存    -> innodb_pool_buffer •   慢查询日志    -> log_slow •   日志优化      -> binlog_cache •  连接线程池    -> thead_cache •  文件描述符缓存   -> table_cache •  各类线程级buffer -> sort/join/read_rnd/read buffer  
  8. •  Query_cache   •  经验值  query_cache_size 设成32 – 128 M

    •  缓存命中率  = Qcache_hits/(Qcache_hits+Qcache_inserts) * 100 % •  query_cache_min_res_unit合理值  = (query_cache_size-Qcache_free_memory / Qcache_queries_in_cache •  当Qcache_lowmem_prunes持续增长,而free memory还比较大,说明query cache有很多碎片。   query cache  
  9. •  Key_buffer •  key_buffer_size 分配给MyISAM  的索引缓存大小 •  Key_buffer_size 的理想值  

     = 所有索引文件的大小 •  Key_buffer_size 的经验值  = 25%- 33% RAM •  查询命中率  = (Key_read_requests- key_reads)/Key_read_requests •  Key_blocks_used ,Key_blocks_unused显示key_buffer的实际使用情况
  10. •  innodb_buffer_pool •  缓存innodb数据和索引 •  Innodb_buffer_pool_size 理想值  = Innodb表数据文件大小+索引文件大小 • 

    Innodb_buffer_pool_size 经验值  = 50% – 80% RAM •  Buffer 使用率  = Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total * 100% •  查询命中率  = (Innodb_buffer_pool_read_requests-Innodb_buffer_pool_reads)/ Innodb_buffer_pool_read_requests * 100%  
  11. •  thread-cache •  连接线程池 •  Thread_cache_size经验值  = 8 - 12

    •  连接线程缓存命中率  = (Connections - Threads_created) / Connections * 100%
  12. 解释   经验值   我们设置的大小   sort_buffer_size   系统在排序时使用的 buffer

      2 – 16 M   8 M   join_buffer_size   当Join 是ALL index , rang 或index_merge 的时候使用的  Buffer   8M     read_buffer_size   顺序读buffer   2M     read_rnd_buffer_size   随机读buffer   16M  
  13. •  表结构设计 •  限制表的数量 –   单库不超过300-400个表 •     限制单表数据量 – 

    一年内纯int不超过1000W –  一年内含char不超过500W •  限制列的数量 –  单表字段数控制在20 – 50个 •  大字段垂直拆分 –  TEXT处理性能远低于VARCHAR –  尽量不用TEXT/BLOB类型字段 –  如必须使用,则拆分到单独的表中 •  反范式 –  适当冗余,减少关联查询    
  14. •  字段类型 •  整型 TINYINT、INT、BIGINT •  浮型 FLOAT、DOUVBLE、DECIMAL、NUMERIC •  时间日期

    DATETIME、DATE、TIMESTAMP •  字符类型 VARCHAR、CHAR、BLOB、TEXT、ENUM  
  15. •  字段设计 •  将字符转为数字 –   用无符号INT存储IP,而非CHAR(15) –  INET_ATON(’10.1.1.1’) = 167837953

    –  INET_NTOA(653235463) = 38.239.149.7 •   优先使用ENUM或SET –  ENUM占用1个字节 –  SET视界节点,最多占用8字节 –  `sex` enum(‘F’,’M’) •  避免使用NULL字段 –  很难进行查询优化 –  NULL列添加索引需要额外空间 –  含NULL复合索引无效 •  使用timestamp而不是datetime –  UNIX_TIMESTAMP('2012-07-17 15:01:15') = 1342508475 –  FROM_UNIXTIME(1342508475) = 2012-07-17 15:01:15
  16. •  MyISAM ü  表锁 ü   不支持事务 ü  Count() 快 ü 

     内存占用和磁盘存储小 •  InnoDB ü  行锁 ü  支持事务 ü  count()慢 ü 内存占用和磁盘存储大  
  17. •  并发读高       MyISAM •  并发写高    

      MyISAM •  并发写高+并发读高   InnoDB  
  18. 垂直分区   优点: •  拆分规则简单 •  数据整合容易      

            •  维护方便 缺点: •  事务处理复杂               •  扩展性有瓶颈  
  19. 水平分区   优点: •  应用程序端架构改动相对较少 •  事务处理相对简单 •  无扩展性限制 缺点:

    •  很难有满足全局的切分规则               •  数据维护复杂 •  应用系统耦合度高  
  20. Amoeba   •  数据切分后数据源整合 •  连接池 •  读写分离路由   与MySQL

    Proxy比较: 优点:不需要自己写大量lua script 缺点:作者个人维护,缺少社区支持