当前位置: 首页 > news >正文

mysql1702_MySQL的通用优化方法

MySQL的通用优化方法

本文整理了一些MySQL的通用优化方法,旨在做好MySQL DBA的基本优化,具体的SQL优化,可通过加适当的索引完成,更复杂的就需要具体分析了。

一、硬件层相关优化

1.1、CPU相关

在服务器的BIOS设置中,可调整下面的几个配置,目的是发挥CPU最大性能,或者避免经典的NUMA问题:

1、选择Performance Per Watt Optimized(DAPC)  模式,发挥CPU最大性能,跑DB这种通常需要高运  算量的服务就不要考虑节电了; 2、关闭C1E和C States等选项,目的也是为了提升  CPU效率; 3、Memory Frequency(内存频率)选择Maximum  Performance(最佳性能); 4、内存设置菜单中,启用Node Interleaving,避免  NUMA问题;

1.2、磁盘I/O相关

下面几个是按照IOPS性能提升的幅度排序,对于磁盘I/O可优化的一些措施:

1、使用SSD或者PCIe SSD设备,至少获得数百倍甚至万倍的IOPS提升;

2、购置阵列卡同时配备CACHE及BBU模块,可明   显提升IOPS(主要是指机械盘,SSD或PCIe SSD除外。同时需要定期检查CACHE及BBU模块的健康   状况,确保意外时不至于丢失数据);

3、有阵列卡时,设置阵列写策略为WB,甚至FORCE WB(若有双电保护,或对数据安全性要     求不是特别高的话),严禁使用WT策略。并且闭   阵列预读策略,基本上是鸡肋,用处不大;4、尽可能选用RAID-10,而非RAID-5;5、使用机械盘的话,尽可能选择高转速的,例如选 用15KRPM,而不是7.2KRPM的盘。

二、系统层相关优化

2.1、文件系统层优化

在文件系统层,下面几个措施可明显提升IOPS性能:

1、使用deadline/noop这两种I/O调度器,cfq不适合跑DB类服务;2、使用xfs文件系统,ext4勉强可用,但业务量很大的话,则一定要用xfs;3、文件系统mount参数中增加:noatime, nodiratime, nobarrier几个选项(nobarrier是xfs文件系统特有的);

2.2、其他内核参数优化

针对关键内核参数设定合适的值,目的是为了减少swap的倾向,并且让内存和磁盘I/O不会出现大幅波动,导致瞬间波峰负载:

1、将vm.swappiness设置为5-10左右即可,甚至设置为0(RHEL 7以上则慎重设置为0,除非允许OOM kill发生),以降低使用SWAP的机会;2、将vm.dirty_background_ratio设置为5-10,将vm.dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待(和MySQL中的innodb_max_dirty_pages_pct类似);3、将net.ipv4.tcp_tw_recycle、net.ipv4.tcp_tw_reuse都设置为1,减少TIME_WAIT,提高TCP效率;4、至于网传的read_ahead_kb、nr_requests这两个参数,经过测试后,发现对读写混合为主的OLTP环境影响并不大。

三、MySQL层相关优化

3.1、关于版本选择

官方版本为ORACLE MySQL,绝大多数人选择它。

建议选择Percona分支版本,它是一个相对比较成熟的、优秀的MySQL分支版本,在性能提升、可靠性、管理型方面做了不少改善。它和官方ORACLE MySQL版本基本完全兼容,并且性能大约有20%以上的提升,因此优先推荐。

另一个重要的分支版本是MariaDB,不能说MariaDB是分支版本,因为它的目标是取代ORACLE MySQL。它主要在原来的MySQL Server层做了大量的源码级改进,也是一个非常可靠的、优秀的分支版本。但也由此产生了以GTID为代表的和官方版本无法兼容的新特性(MySQL 5.7开始,也支持GTID模式在线动态开启或关闭了)

3.2、关于最重要的参数选项调整建议

建议调整下面几个关键参数以获得较好的性能:

1、如果选择Percona或MariaDB版本的,强烈建议启用thread pool特性,可使得在高并发的情况下,性能不会发生大幅下降。此外,还有extra_port功能,非常实用。还有另外一个重要特色是 QUERY_RESPONSE_TIME 功能,也能使我们对整体的SQL响应时间分布有直观感受;2、设置default-storage-engine=InnoDB,也就是默认采用InnoDB引擎,InnoDB引擎可以满足99%以上的业务场景;3、调整innodb_buffer_pool_size大小,如果是单实例且绝大多数是InnoDB引擎表的话,可考虑设置为物理内存的50% ~ 70%左右;4、根据实际需要设置innodb_flush_log_at_trx_commit、sync_binlog的值。如果要求数据不能丢失,那么两个都设为1。如果允许丢失一点数据,则可分别设为2和10。而如果完全不用care数据是否丢失的话(例如在slave上,可以重做),则可都设为0。这三种设置值导致数据库的性能受到影响程度分别是:高、中、低,也就是第一个会另数据库最慢,最后一个则相反;5、设置innodb_file_per_table = 1,使用独立表空间。6、设置innodb_data_file_path = ibdata1:1G:autoextend,而用默认的10M,在有高并发事务时,会受到很大影响;7、设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;8、设置long_query_time = 1,而在5.5版本以上,已经可以设置为小于1了,建议设置为0.05(50毫秒),记录那些执行较慢的SQL,用于后续的分析排查;9、根据业务实际需要,适当调整max_connection(最大连接数)、max_connection_error(最大错误数,建议设置为10万以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约10倍于max_connection的大小;10、常见的误区是把tmp_table_size和max_heap_table_size设置的比较大,设置为1G的,这2个选项是每个连接会话都会分配的,因此不要设置过大,否则容易导致OOM发生;其他的一些连接会话级选项例如:sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等,也需要注意不能设置过大;11、由于已经建议不再使用MyISAM引擎了,因此可以把key_buffer_size设置为32M左右,并建议关闭query cache功能;

3.3、关于Schema设计规范及SQL使用建议

下面列举了几个常见有助于提升MySQL效率的Schema设计规范及SQL使用建议:

1、所有的InnoDB表都设计一个无业务用途的自增列做主键,对于绝大多数场景都是如此,真正纯只读用InnoDB表的并不多,建议用TokuDB;2、字段长度满足需求前提下,尽可能选择长度小的。此外,字段属性尽量都加上NOT NULL约束,可一定程度提高性能;3、尽可能不使用TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要和主表放在一起,避免SELECT * 的时候性能太差。4、读取数据时,只选取所需要的列,不要每次都SELECT *,避免产生严重的随机读问题,尤其是读到一些TEXT/BLOB列;5、对一个VARCHAR(N)列创建索引时,通常取其50%(甚至更小)左右长度创建前缀索引就足以满足80%以上的查询需求了,无需创建整列的全长度索引;6、通常情况下,子查询的性能比较差,建议改造成JOIN写法;7、多表联接查询时,关联字段类型尽量一致,并且都要有索引;8、多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一定是全表数据量小的)作为驱动表;9、多表联接并且有排序时,排序字段必须是驱动表里的,否则排序列无法用到索引;10、多用复合索引,少用多个独立索引,尤其是一些基数(Cardinality)太小(比如说,该列的唯一值总数少于255)的列就不要创建独立索引了;11、类似分页功能的SQL,建议先用主键关联,然后返回结果集,效率会高很多;

3.3、其他建议

关于MySQL的管理维护的其他建议有:

1、通常地,单表物理大小不超过10GB,单表行数不超过1亿条,行平均长度不超过8KB,如果机器性能足够,这些数据量MySQL是完全能处理的过来的,不用担心性能问题,这么建议主要是考虑ONLINE DDL的代价较高;2、不用太担心mysqld进程占用太多内存,只要不发生OOM kill和用到大量的SWAP都还好;

3、在以往,单机上跑多实例的目的是能最大化利用计算资源,如果单实例已经能耗尽大部分计算资源的话,就没必要再跑多实例了;4、定期使用pt-duplicate-key-checker检查并删除重复的索引。定期使用pt-index-usage工具检查并删除使用频率很低的索引;5、定期采集slow query log,用pt-query-digest工具进行分析,可结合Anemometer系统进行slow query管理以便分析slow query并进行后续优化工作;6、可使用pt-kill杀掉超长时间的SQL请求,Percona版本中有个选项 innodb_kill_idle_transaction 也可实现该功能;7、使用pt-online-schema-change来完成大表的ONLINE DDL需求;8、定期使用pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差异;

如果应用场景和描述的不一致,建议根据实际情况进行调整。

了解更多关于电脑手机方面的小知识,请多多关注周四的技术课堂~~~

本推送仅限班级内阅读。请勿转发。

相关文章:

  • 从wos到结果分析 详细
  • 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度...
  • citespace关键词分析 概念树
  • mysql电子词典_电子词典阶段性小项目
  • 找不到类com.mysql_java – 在webservice 中找不到类异常Class.forName(“com.mysql.jdbc.Driver”)...
  • mysql服务器管理员_配置MySQL服务器时,需要设置一个管理员账号,其名称是( )。...
  • linux基础
  • mysql zookeeper 切换_利用ZOOKEEPER技术 MYSQL数据库容灾切换
  • conda入门到精通
  • python class tynu()_调用百度地图API与语音API实现简易地图语音导航
  • 小d课堂mysql_mysql之explain详解(分析索引的最佳使用)
  • LINUX 批量删除文件的几种方法
  • mysql 模糊 不包括_Oracle 模糊查询中不包括某字符串的实现方式
  • star 序列比对2020-12-25
  • java线程模式_Java多线程基础(十一)——Future模式
  • C++11: atomic 头文件
  • Cumulo 的 ClojureScript 模块已经成型
  • Druid 在有赞的实践
  • Github访问慢解决办法
  • Linux快速复制或删除大量小文件
  • Redis在Web项目中的应用与实践
  • SegmentFault 2015 Top Rank
  • spring + angular 实现导出excel
  • 树莓派 - 使用须知
  • 为视图添加丝滑的水波纹
  • 找一份好的前端工作,起点很重要
  • 白色的风信子
  • hi-nginx-1.3.4编译安装
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​HTTP与HTTPS:网络通信的安全卫士
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (第一天)包装对象、作用域、创建对象
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)Linux下编译安装log4cxx
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET大文件上传知识整理
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Android]通过PhoneLookup读取所有电话号码
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [bbk5179]第66集 第7章 - 数据库的维护 03
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [BZOJ4010]菜肴制作
  • [cb]UIGrid+UIStretch的自适应
  • [FUNC]判断窗口在哪一个屏幕上
  • [Google Guava] 2.1-不可变集合
  • [HNOI2006]鬼谷子的钱袋
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!
  • [Java]深入剖析常见排序
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [LeetCode] Sort List
  • [LeetCode]剑指 Offer 42. 连续子数组的最大和