本文主要介绍如何编写mysql常用底层优化操作教程及相关建议(mysql常用底层优化操作教程及相关建议),下面一起看看如何编写mysql常用底层优化操作教程及相关建议(mysql常用底层优化操作教程及相关建议)相关资讯。
1.硬件层相关优化1.1。cpu与服务器的bios设置有关。以下配置可以调整cpu的最大性能或避免经典numa的问题:(1)选择每瓦性能优化(dapc)模式使cpu的性能最大化,运行数据库通常需要高流量,不考虑节能。(2)关闭c1e选项和c国的设计也提高了cpu的效率;(3)内存频率(memory frequency)选择最大性能(最佳性能);(4)在内存中设置菜单,交叉节点,可以避免numa问题。1.2.磁盘i/o相关以下是根据iops介绍的一些可以提高磁盘i/o性能的幅度优化措施:(1)使用ssd或pcie ssd设备,至少可以提高几百甚至上万的iops;(2)阵列卡采集同时配备缓存和bbu模块,可以明显提升iops(主要是机械硬盘、ssd、pcie ssd)。同时要定期检查健康缓存和bbu模块,确保数据不出意外。(3)阵列卡安装时,阵列写策略是wb甚至强制wb(如果有双电保护或者数据安全要求不高),严禁使用wt策略,阵列预取策略基本没用;(4)尽量选择raid-10,而不是raid-5;(5)、使用机械盘,尽量选择高转速,如选择15krpm,而不是7.2krpm的盘,不会低于几块钱;2、系统级相关优化2.1、文件系统级优化在文件系统级,以下措施可以显著提升iops性能:(1)使用两个截止期的i//noop调度器,不使用cfq(不适合运行数据库服务);(2)使用xfs文件系统代替ext3;ext4勉强可用,但业务量很大,必须用xfs;;(3)增加了几个文件系统挂载参数:noatime、nodiratime、nobarrier (nobarrier是xfs文件系统特有的);2.2.其他核心参数的优化为关键核心参数设置合适的值,以减少交换倾向,使内存和磁盘的i/o不会出现大的波动,造成瞬时峰值负载。(1)将vm.swappiness设置为5-10左右,甚至设置为0(rhel 7谨慎设置为0,除非你允许oom杀发生),从而减少使用互换的机会。(2)设置vm.dirty_background_ratio 5-10,并设置vm.dirt。y_ratio为两倍,从而保证脏数据可以持续刷新到磁盘,避免i/o即时写入和严重等待(类似innodb _ max _ dirty _ pages _ pct mysql)。(3)、net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少了time_wait,提高了tcp的效率;(4)、r测试,oltp主要影响读写环境,发现我的测试方法有问题,因为没有混合(应该看场景,比较灵敏,但是没有影响),可以考虑是否调整;3与mysql layer 3.1相关的优化。论翻译的选择官方版本叫oracle mysql,没什么好说的。相信大部分人都会选择。个人强烈推荐percona的分支版本选择。是一个比较成熟优秀的mysql分支版本,在性能提升、可靠性、管理等方面做了很多改进。基本兼容mysql正式版,性能提升20%以上。所以我先推荐一下,从08年就开始关注了。另一个重要的分支版本是mariadb,不太合适。mariadb是一个分支版本,因为它的目标是取代oracle s mysql。它对原有的mysql服务器层做了很多源码级的改进,也是一个非常可靠和优秀的分支版本。但是,这与gtid的正式版新功能并不兼容。(mysql 5.7还支持在线动态打开或关闭gtid模式)。考虑到大多数人会遵循官方说法,mariadb并不推荐。3.2。最重要参数的调整建议建议调整以下关键参数以获得更好的性能:(1)如果选择percona或mariadb版本,强烈建议开启线程池功能,在低并况下会明显降低性能。此外,还有一个extra_port函数非常有用,可以救。另一个重要的特性是query_response_time的功能,它也可以给我们一个整体sql响应时间分布的直观意义。(2)设置默认存储引擎= innodb,也就是说innodb引擎采用默认。强烈建议不要使用myisam引擎。innodb引擎完全可以满足99%以上的业务场景。(3)调整innodb_buffer_pool_size的大小。如果它是单个实例,主要是innodb引擎的一个表,那么它可以认为是物理内存的50%到70%。(4)根据实际需要设置innodb_flush_log_at_trx_commit和sync_binlog的值。如果数据不能丢失,那么这两者被设置为1。如果一位数据不能丢失,可以设置为2和10。如果医疗保健数据没有完全丢失(例如,在从设备中,它不能重复),可以将其设置为0。三个设置影响数据库的性能,高、中、低,即第一个数据库会慢,最后一个则相反。(5)设置innodb_file_per_table = 1,使用独立的表空间。我真的不知道。;我不想利用共享表空间的好处。(6)set innodb _ data _ file _ path = ibdata1e: 1g:automatic,don 不要使用默认的10m,否则,当你有高并发事务时,你会受到很大的影响。(7)innodb _ log _ file _ size = m = 2 innodb _ log _ files _ in _ group的设置基本可以满足以上90%的场景。(8),设置long_query_time = 1,在5.5版本中,设置为小于1。推荐的设置是0.05(50毫秒),记录那些缓慢的sql以便后续分析和研究。(9)根据实际需要,调整max_connection(最大连接数)和max_connection_error(错误,大于10万。同时open_files_limit、inndb _ open _ files、table_open_cache、table_definition_cache的参数可以设置为max_connection大小的10倍左右。(10),一个常见的误解是tmp_table_size和max_heap_table_size比较大。一旦它被设置为1g,两个选项将被分配给每个连接会话,所以不要 不要设置太高,否则容易导致oom。其他会话级选项,如sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size,需要注意不要设置太大;(11)建议不再使用myisam引擎,可以将key_buffer_size设置为32m左右,强烈推荐。3.3。关于模式设计规范和sql使用的建议下面是几种常见的模式设计规范和sql建议,有助于提高mysql效率。(1),所有innodb表都设计了一个没有商业用途的自增列作为主键,这对于大多数场景都是成立的。真正纯只读的innodb表用的不多,还不如tokudb。(2)在字段长度满足要求的情况下,长度越小越好,字段属性中尽可能加入非空约束,在一定程度上提高了性能。(3)尽量不要使用文本类型。如果真的有必要,建议把分子表拆开,不要和主表放在一起,以免选*时性能不佳。(4)在读取数据时,只选择需要的列,不要 不要总是选择*以避免严重的随机阅读问题,尤其是阅读一些文本/专栏。(5)在创建varchar(n)列的索引时,通常需要50%(甚至更小)的长度作为前缀索引,足以满足80%以上的需求查询。不需要创建整列的全长索引。(6)一般情况下,子查询的性能较差,建议改成联接。(7)多表连接查询时,相关字段的类型要尽可能一致,所以需要索引。(8)多表连接查询时,选择结果集的小表作为驱动表。(9)在对多个表进行连接和排序时,必须驱动排序字段,否则无法对系列进行索引。(10)使用复合索引和多个独立索引,尤其是那些基数太小的索引(cardinality)(比如列的总值小于255)。不要创建独立的索引。(11)提出类似分页功能的sql,先关联主关键字再返回结果集,效率会大大提高。3.4。对mysql的管理和维护的其他建议如下:(1)通常一个表的物理大小小于10gb,单个表的数量不超过1亿,平均长度不超过8kb。如果机器性能不够,数据量完全可以用mysql处理,不用担心性能问题,所以考虑了在线ddl的高成本;(2)唐 不要太担心mysqld进程占用太多内存,只要没有oom和大量的交换;(3)过去,在一台机器上运行多个实例的目的是最大限度地利用计算资源。如果单个实例用尽了大部分计算资源,就没有必要运行更多的实例。(4)定期使用pt重复键检查器检查和删除重复索引,定期使用pt索引工具检查和删除频率很低的索引。(5)定期收集慢查询日志,使用pt查询汇总工具进行分析。慢查询管理可以结合风速计系统,对慢查询进行分析,并进行后续优化。(6) pt killing可以用来杀死sql请求。长期以来,percona版本中有一个选项innodb_kill_idle_transaction,也可以实现。(7)白金在线模式的改变完成了大表的在线d。使用dl的要求;(8)利用pt表校验和、pt表定期检查修复mysql主从复制的数据差异;
了解更多如何编写mysql常用底层优化操作教程及相关建议(mysql常用底层优化操作教程及相关建议)相关内容请关注本站点。