MYSQL教程MySQL常见的底层优化操作教程及相关建议
《MYSQL教程MySQL常见的底层优化操作教程及相关建议》要点: 1、硬件层相关优化MYSQL必读 1.1、CPU相关MYSQL必读 ?? 在服务器的BIOS设置中,可调整下面的几个配置,目的是发挥CPU最大性能,或者避免经典的NUMA问题:MYSQL必读 (1)、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常必要高运算量的服务就不要考虑节电了; (4)、内存设置菜单中,启用Node Interleaving,避免NUMA问题; ?? 下面几个是依照IOPS性能提升的幅度排序,对于磁盘I/O可优化的一些措施:MYSQL必读 (1)、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升; (3)、有阵列卡时,设置阵列写策略为WB,甚至FORCE WB(若有双电保护,或对数据平安性要求不是特别高的话),严禁使用WT策略.并且闭阵列预读策略,基本上是鸡肋,用处不大;MYSQL必读 (4)、尽可能选用RAID-10,而非RAID-5;MYSQL必读 (5)、使用机械盘的话,尽可能选择高转速的,例如选用15KRPM,而不是7.2KRPM的盘,不差几个钱的; 2.1、文件系统层优化MYSQL必读 ?? 在文件系统层,下面几个步伐可明显提升IOPS性能:MYSQL必读 (1)、使用deadline/noop这两种I/O调度器,千万别用cfq(它不适合跑DB类服务); (3)、文件系统mount参数中增加:noatime,nodiratime,nobarrier几个选项(nobarrier是xfs文件系统特有的); ?? 针对关键内核参数设定合适的值,目的是为了减少swap的倾向,而且让内存和磁盘I/O不会出现大幅波动,导致瞬间波峰负载:MYSQL必读 (1)、将vm.swappiness设置为5-10左右即可,甚至设置为0(RHEL 7以上则慎重设置为0,除非你允许OOM kill发生),以降低使用SWAP的机会; (3)、将net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率;MYSQL必读 (4)、至于网传的read_ahead_kb、nr_requests这两个参数,我经过测试后,发现对读写混合为主的OLTP环境影响并不大(应该是对读敏感的场景更有效果),不过没准是我测试办法有问题,可自行斟酌是否调整;MYSQL必读 3、MySQL层相关优化MYSQL必读 3.1、关于版本选择MYSQL必读 ?? 官方版本我们称为ORACLE MySQL,这个没什么好说的,相信绝大多数人会选择它.MYSQL必读 ?? 我个人强烈建议选择Percona分支版本,它是一个相对比较成熟的、优秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了不少改善.它和官方ORACLE MySQL版本基本完全兼容,并且性能大约有20%以上的提升,因此我优先保举它,我自己也从2008年一直以它为主.MYSQL必读 ?? 另一个重要的分支版本是MariaDB,说MariaDB是分支版本其实已经不太合适了,因为它的目标是取代ORACLE MySQL.它主要在原来的MySQL Server层做了大量的源码级改进,也是一个非常可靠的、优秀的分支版本.但也由此产生了以GTID为代表的和官方版本无法兼容的新特性(MySQL 5.7开始,也支持GTID模式在线动态开启或关闭了),也考虑到绝大多数人还是会跟着官方版本走,因此没优先保举MariaDB.MYSQL必读 3.2、关于最重要的参数选项调整建议MYSQL必读 ?? 建议调整下面几个关键参数以获得较好的性能: (2)、设置default-storage-engine=InnoDB,也便是默认采用InnoDB引擎,强烈建议不要再使用MyISAM引擎了,InnoDB引擎绝对可以满足99%以上的业务场景;MYSQL必读 (3)、调整innodb_buffer_pool_size大小,如果是单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的50% ~ 70%左右;MYSQL必读 (4)、根据实际必要设置innodb_flush_log_at_trx_commit、sync_binlog的值.如果要求数据不能丢失,那么两个都设为1.如果允许丢失一点数据,则可分别设为2和10.而如果完全不用care数据是否丢失的话(例如在slave上,反正大不了重做一次),则可都设为0.这三种设置值导致数据库的性能受到影响程度分别是:高、中、低,也就是第一个会另数据库最慢,最后一个则相反;MYSQL必读 (5)、设置innodb_file_per_table = 1,使用独立表空间,我实在是想不出来用共享表空间有什么好处了;MYSQL必读 (6)、设置innodb_data_file_path = ibdata1:1G:autoextend,千万不要用默认的10M,不然在有高并发事务时,会受到不小的影响;MYSQL必读 (7)、设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;MYSQL必读 (8)、设置long_query_time = 1,而在5.5版本以上,已经可以设置为小于1了,建议设置为0.05(50毫秒),记录那些执行较慢的SQL,用于后续的分析排查;MYSQL必读 (9)、根据业务实际必要,适当调整max_connection(最大连接数)、max_connection_error(最大错误数,建议设置为10万以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约10倍于max_connection的大小;MYSQL必读 (10)、常见的误区是把tmp_table_size和max_heap_table_size设置的比拟大,曾经见过设置为1G的,这2个选项是每个连接会话都会分配的,因此不要设置过大,否则容易导致OOM发生;其他的一些连接会话级选项例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能设置过大;MYSQL必读 (11)、由于已经建议不再使用MyISAM引擎了,因此可以把key_buffer_size设置为32M左右,而且强烈建议关闭query cache功能; ?? 下面列举了几个常见有助于提升MySQL效率的Schema设计规范及SQL使用建议:MYSQL必读 (1)、所有的InnoDB表都设计一个无业务用途的自增列做主键,对于绝大多数场景都是如此,真正纯只读用InnoDB表的并不多,真如此的话还不如用TokuDB来得划算;MYSQL必读 (2)、字段长度满足需求前提下,尽可能选择长度小的.此外,字段属性尽量都加上NOT NULL约束,可必定程度提高性能;MYSQL必读 (3)、尽可能不使用TEXT/BLOB类型,确实必要的话,建议拆分到子表中,不要和主表放在一起,避免SELECT * 的时候读性能太差.MYSQL必读 (4)、读取数据时,只选取所必要的列,不要每次都SELECT *,避免产生严重的随机读问题,尤其是读到一些TEXT/BLOB列;MYSQL必读 (5)、对一个VARCHAR(N)列创建索引时,通常取其50%(甚至更小)左右长度创建前缀索引就足以满足80%以上的查询需求了,没需要创建整列的全长度索引;MYSQL必读 (6)、通常情况下,子查询的性能比拟差,建议改造成JOIN写法;MYSQL必读 (7)、多表联接查询时,关联字段类型尽量一致,而且都要有索引;MYSQL必读 (8)、多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不必定是全表数据量小的)作为驱动表;MYSQL必读 (9)、多表联接并且有排序时,排序字段必需是驱动表里的,否则排序列无法用到索引;MYSQL必读 (10)、多用复合索引,少用多个独立索引,尤其是一些基数(Cardinality)太小(好比说,该列的唯一值总数少于255)的列就不要创建独立索引了;MYSQL必读 (11)、类似分页功能的SQL,建议先用主键关联,然后返回结果集,效率会高很多; ?? 关于MySQL的管理维护的其他建议有:MYSQL必读 (1)、通常地,单表物理大小不超过10GB,单表行数不超过1亿条,行平均长度不超过8KB,如果机器性能足够,这些数据量MySQL是完全能处理的过来的,不消担心性能问题,这么建议主要是考虑ONLINE DDL的代价较高;MYSQL必读 (2)、不消太担心mysqld进程占用太多内存,只要不发生OOM kill和用到大量的SWAP都还好;MYSQL必读 (3)、在以往,单机上跑多实例的目的是能最大化利用计算资源,如果单实例已经能耗尽大部分计算资源的话,就没需要再跑多实例了;MYSQL必读 (4)、定期使用pt-duplicate-key-checker检查并删除重复的索引.定期使用pt-index-usage工具检查并删除使用频率很低的索引;MYSQL必读 (5)、定期采集slow query log,用pt-query-digest工具进行分析,可结合Anemometer系统进行slow query管理以便分析slow query并进行后续优化工作;MYSQL必读 (6)、可使用pt-kill杀掉超长时间的SQL哀求,Percona版本中有个选项 innodb_kill_idle_transaction 也可实现该功能;MYSQL必读 (7)、使用pt-online-schema-change来完成大表的ONLINE DDL需求;MYSQL必读 (8)、定期使用pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差别;MYSQL必读 编程之家PHP培训学院每天发布《MYSQL教程MySQL常见的底层优化操作教程及相关建议》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |