1. 首页 > 知识

关于MySQL性能调优你必须了解的15个重要变量(小结)

关于MySQL性能调优你必须了解的15个重要变量(小结)

前言:MYSQL 应该是最流行了 WEB 后端数据库。虽然 NOSQL 最近越来越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。本文作者总结梳理MySQL性能调优的15个重要变量,又不足需要补充的还望大佬指出。1。DEFAULT_STORAGE_ENGINE如果你已经在用MySQL 5。
6或者5。7,并且你的数据表都是InnoDB,那么表示你已经设置好了。如果没有,确保把你的表转换为InnoDB并且设置default_storage_engine为InnoDB。为什么?简而言之,因为InnoDB是MySQL(包括Percona Server和MariaDB)最好的存储引擎 – 它支持事务,高并发,有着非常好的性能表现(当配置正确时)。
这里有详细的版本介绍为什么2。INNODB_BUFFER_POOL_SIZE这个是InnoDB最重要变量。实际上,如果你的主要存储引擎是InnoDB,那么对于你,这个变量对于MySQL是最重要的。基本上,innodb_buffer_pool_size指定了MySQL应该分配给InnoDB缓冲池多少内存,InnoDB缓冲池用来存储缓存的数据,二级索引,脏数据(已经被更改但没有刷新到硬盘的数据)以及各种内部结构如自适应哈希索引。
根据经验,在一个独立的MySQL服务器应该分配给MySQL整个机器总内存的80%。如果你的MySQL运行在一个共享服务器,或者你想知道InnoDB缓冲池大小是否正确设置,详细请看这里。3。INNODB_LOG_FILE_SIZEInnoDB重做日志文件的设置在MySQL社区也叫做事务日志。
直到MySQL 5。6。8事务日志默认值innodb_log_file_size=5M是唯一最大的InnoDB性能杀手。从MySQL 5。6。8开始,默认值提升到48M,但对于许多稍繁忙的系统,还远远要低。根据经验,你应该设置的日志大小能在你服务器繁忙时能存储1-2小时的写入量。
如果不想这么麻烦,那么设置1-2G的大小会让你的性能有一个不错的表现。这个变量也相当重要,更详细的介绍请看这里。在进入下一个变量之前,让我们来快速提及一下innodb_log_buffer_size。“快速提及”是因为它常常不好理解并且往往被过度关注了。
事实上大多数情况下你只需要使用小的缓冲 – 在事务被提交并写入到硬盘前足够保存你的小事务更改了。当然,如果你有大量的大事务更改,那么,更改比默认innodb日志缓冲大小更大的值会对你的性能有一定的提高,但是你使用的是autocommit,或者你的事务更改小于几k,那还是保持默认的值吧。
4。INNODB_FLUSH_LOG_AT_TRX_COMMIT默认下,innodb_flush_log_at_trx_commit设置为1表示InnoDB在每次事务提交后立即刷新同步数据到硬盘。如果你使用autocommit,那么你的每一个INSERT, UPDATE或DELETE语句都是一个事务提交。
同步是一个昂贵的操作(特别是当你没有写回缓存时),因为它涉及对硬盘的实际同步物理写入。所以如果可能,并不建议使用默认值。两个可选的值是0和2:* 0表示刷新到硬盘,但不同步(提交事务时没有实际的IO操作)* 2表示不刷新和不同步(也没有实际的IO操作)所以你如果设置它为0或2,则同步操作每秒执行一次。
所以明显的缺点是你可能会丢失上一秒的提交数据。具体来说,你的事务已经提交了,但服务器马上断电了,那么你的提交相当于没有发生过。显示的,对于金融机构,如银行,这是无法忍受的。不过对于大多数网站,可以设置为innodb_flush_log_at_trx_commit=0|2,即使服务器最终崩溃也没有什么大问题。
毕竟,仅仅在几年前有许多网站还是用MyISAM,当崩溃时会丢失30s的数据(更不要提那令人抓狂的慢修复进程)。那么,0和2之间的实际区别是什么?性能明显的差异是可以忽略不计,因为刷新到操作系统缓存的操作是非常快的。所以很明显应该设置为0,万一MySQL崩溃(不是整个机器),你不会丢失任何数据,因为数据已经在OS缓存,最终还是会同步到硬盘的。
5。SYNC_BINLOG已经有大量的文档写到sync_binlog,以及它和innodb_flush_log_at_trx_commit的关系,下面我们来简单的介绍下:a) 如果你的服务器没有设置从服务器,而且你不做备份,那么设置sync_binlog=0将对性能有好处。
b) 如果你有从服务器并且做备份,但你不介意当主服务器崩溃时在二进制日志丢失一些事件,那么为了更好的性能还是设置为sync_binlog=0。c) 如果你有从服务器并且备份,你非常在意从服务器的一致性,以及能及时恢复到一个时间点(通过使用最新的一致性备份和二进制日志将数据库恢复到特定时间点的能力),那么你应该设置innodb_flush_log_at_trx_commit=1,并且需要认真考虑使用sync_binlog=1。
问题是sync_binlog=1代价比较高 – 现在每个事务也要同步一次到硬盘。你可能会想为什么不把两次同步合并成一次,想法正确 – 新版本的MySQL(5。6和5。7,MariaDB和Percona Server)已经能合并提交,那么在这种情况下sync_binlog=1的操作也不是这么昂贵了,但在旧的mysql版本中仍然会对性能有很大影响。
6。INNODB_FLUSH_METHOD将innodb_flush_method设置为O_DIRECT以避免双重缓冲。唯一一种情况你不应该使用O_DIRECT是当你操作系统不支持时。但如果你运行的是Linux,使用O_DIRECT来激活直接IO。
不用直接IO,双重缓冲将会发生,因为所有的数据库更改首先会写入到OS缓存然后才同步到硬盘 – 所以InnoDB缓冲池和OS缓存会同时持有一份相同的数据。特别是如果你的缓冲池限制为总内存的50%,那意味着在写密集的环境中你可能会浪费高达50%的内存。
如果没有限制为50%,服务器可能由于OS缓存的高压力会使用到swap。简单地说,设置为innodb_flush_method=O_DIRECT。7。INNODB_BUFFER_POOL_INSTANCESMySQL 5。5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段。
在5。5版本这个对提升吞吐量帮助很小,然后在MySQL 5。6版本这个提升就非常大了,所以在MySQL5。5中你可能会保守地设置innodb_buffer_pool_instances=4,在MySQL 5。6和5。7中你可以设置为8-16个缓冲池实例。
你设置后观察会觉得性能提高不大,但在大多数高负载情况下,它应该会有不错的表现。对了,不要指望这个设置能减少你单个查询的响应时间。这个是在高并发负载的服务器上才看得出区别。比如多个线程同时做许多事情。8。INNODB_THREAD_CONCURRENCY你可能会经常听到应该设置innodb_thread_concurrency=0然后就不要管它了。
不过这个只在低负载服务器使用时才正确。然后,如果你的服务器的CPU或者IO使用接受饱和,特别是偶尔出现峰值,这时候系统想在超载时能正常处理查询,那么强烈建议关注innodb_thread_concurrency。InnoDB有一种方法来控制并行执行的线程数 – 我们称为并发控制机制。
大部分是由innodb_thread_concurrency值来控制的。如果设置为0,并发控制就关闭了,因此InnoDB会立即处理所有进来的请求(尽可能多的)。在你有32CPU核心且只有4个请求时会没什么问题。不过想像下你只有4CPU核心和32个请求时 – 如果你让32个请求同时处理,你这个自找麻烦。
因为这些32个请求只有4 CPU核心,显然地会比平常慢至少8倍(实际上是大于8倍),而然这些请求每个都有自己的外部和内部锁,这有很大可能堆积请求。下面介绍如何更改这个变量,在mysql命令行提示符执行:SET global innodb_thread_concurrency=X;对于大多数工作负载和服务器,设置为8是一个好开端,然后你可以根据服务器达到了这个限制而资源使用率利用不足时逐渐增加。
可以通过show engine innodb status\G来查看目前查询处理情况,查找类似如下行:22 queries inside InnoDB, 104 queries in queue9。SKIP_NAME_RESOLVE这一项不得不提及,因为仍然有很多人没有添加这一项。
你应该添加skip_name_resolve来避免连接时DNS解析。大多数情况下你更改这个会没有什么感觉,因为大多数情况下DNS服务器解析会非常快。不过当DNS服务器失败时,它会出现在你服务器上出现“unauthenticated connections” ,而就是为什么所有的请求都突然开始慢下来了。
所以不要等到这种事情发生才更改。现在添加这个变量并且避免基于主机名的授权。10。INNODB_IO_CAPACITY, INNODB_IO_CAPACITY_MAX* innodb_io_capacity:用来当刷新脏数据时,控制MySQL每秒执行的写IO量。
* innodb_io_capacity_max: 在压力下,控制当刷新脏数据时MySQL每秒执行的写IO量首先,这与读取无关 – SELECT查询执行的操作。对于读操作,MySQL会尽最大可能处理并返回结果。至于写操作,MySQL在后台会循环刷新,在每一个循环会检查有多少数据需要刷新,并且不会用超过innodb_io_capacity指定的数来做刷新操作。
这也包括更改缓冲区合并(在它们刷新到磁盘之前,更改缓冲区是辅助脏页存储的关键)。第二,我需要解释一下什么叫“在压力下”,MySQL中称为”紧急情况”,是当MySQL在后台刷新时,它需要刷新一些数据为了让新的写操作进来。然后,MySQL会用到innodb_io_capacity_max。
那么,应该设置innodb_io_capacity和innodb_io_capacity_max为什么呢?最好的方法是测量你的存储设置的随机写吞吐量,然后给innodb_io_capacity_max设置为你的设备能达到的最大IOPS。innodb_io_capacity就设置为它的50-75%,特别是你的系统主要是写操作时。
通常你可以预测你的系统的IOPS是多少。例如由8 15k硬盘组成的RAID10能做大约每秒1000随机写操作,所以你可以设置innodb_io_capacity=600和innodb_io_capacity_max=1000。许多廉价企业SSD可以做4,000-10,000 IOPS等。
这个值设置得不完美问题不大。但是,要注意默认的200和400会限制你的写吞吐量,因此你可能偶尔会捕捉到刷新进程。如果出现这种情况,可能是已经达到你硬盘的写IO吞吐量,或者这个值设置得太小限制了吞吐量。11。INNODB_STATS_ON_METADATA如果你跑的是MySQL 5。
6或5。7,你不需要更改innodb_stats_on_metadata的默认值,因为它已经设置正确了。不过在MySQL 5。5或5。1,强烈建议关闭这个变量 – 如果是开启,像命令show table status会立即查询INFORMATION_SCHEMA而不是等几秒再执行,这会使用到额外的IO操作。
从5。1。32版本开始,这个是动态变量,意味着你不需要重启MySQL服务器来关闭它。12。INNODB_BUFFER_POOL_DUMP_AT_SHUTDOWN & INNODB_BUFFER_POOL_LOAD_AT_STARTUPinnodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup这两个变量与性能无关,不过如果你偶尔重启mysql服务器(如生效配置),那么就有关。
当两个都激活时,MySQL缓冲池的内容(更具体地说,是缓存页)在停止MySQL时存储到一个文件。当你下次启动MySQL时,它会在后台启动一个线程来加载缓冲池的内容以提高预热速度到3-5倍。两件事:第一,它实际上没有在关闭时复制缓冲池内容到文件,仅仅是复制表空间ID和页面ID – 足够的信息来定位硬盘上的页面了。
然后它就能以大量的顺序读非常快速的加载那些页面,而不是需要成千上万的小随机读。第二,启动时是在后台加载内容,因为MySQL不需要等到缓冲池内容加载完成再开始接受请求(所以看起来不会有什么影响)。从MySQL 5。7。7开始,默认只有25%的缓冲池页面在mysql关闭时存储到文件,但是你可以控制这个值 – 使用innodb_buffer_pool_dump_pct,建议75-100。
这个特性从MySQL 5。6才开始支持。13。INNODB_ADAPTIVE_HASH_INDEX_PARTS如果你运行着一个大量SELECT查询的MySQL服务器(并且已经尽可能优化),那么自适应哈希索引将下你的下一个瓶颈。自适应哈希索引是InnoDB内部维护的动态索引,可以提高最常用的查询模式的性能。
这个特性可以重启服务器关闭,不过默认下在mysql的所有版本开启。这个技术非常复杂,在大多数情况下它会对大多数类型的查询直到加速的作用。不过,当你有太多的查询往数据库,在某一个点上它会花过多的时间等待AHI锁和闩锁。如果你的是MySQL 5。
7,没有这个问题 – innodb_adaptive_hash_index_parts默认设置为8,所以自适应哈希索引被切割为8个分区,因为不存在全局互斥。不过在mysql 5。7前的版本,没有AHI分区数量的控制。换句话说,有一个全局互斥锁来保护AHI,可能导致你的select查询经常撞墙。
所以如果你运行的是5。1或5。6,并且有大量的select查询,最简单的方案就是切换成同一版本的Percona Server来激活AHI分区。14。QUERY_CACHE_TYPE如果人认为查询缓存效果很好,肯定应该使用它。好吧,有时候是有用的。
不过这个只在你在低负载时有用,特别是在低负载下大多数是读取,小量写或者没有。如果是那样的情况,设置query_cache_type=ON和query_cache_size=256M就好了。不过记住不能把256M设置更高的值了,否则会由于查询缓存失效时,导致引起严重的服务器停顿。
如果你的MySQL服务器高负载动作,建议设置query_cache_size=0和query_cache_type=OFF,并重启服务器生效。那样Mysql就会停止在所有的查询使用查询缓存互斥锁。15。TABLE_OPEN_CACHE_INSTANCES从MySQL 5。
6。6开始,表缓存能分割到多个分区。表缓存用来存放目前已打开表的列表,当每一个表打开或关闭互斥体就被锁定 – 即使这是一个隐式临时表。使用多个分区绝对减少了潜在的争用。从MySQL 5。7。8开始,table_open_cache_instances=16是默认的配置。

相关推荐

  • 深圳无抵押贷款办理需要什么?

    深圳无抵押贷款办理需要什么?

    办理,贷款,银行,申请办理,查询,想在深圳申请无抵押贷款,请问需要什么条件?在深圳申请无抵押贷款需要了解该业务的流程:1、准备好贷款材料  在申请办理个人无抵押贷款时,你需要提前准备好贷款材料,据了解,个人无抵押贷款的申请材料主要包括二代身份证以及复印件、近三至六个月的银行流水单、居住证明。2、提前查询征信报告  由于个人无抵押贷款不需要借款人提供抵押物,因此对于借款人的个人资质很看重,其中最重要的就是个人信用记录。银行一般会看近两年的信...

  • 广州大学生可以办理无抵押贷款吗?

    广州大学生可以办理无抵押贷款吗?

    办理,银行,广州,信用,操作,我是广州的一名在校大学生,最近手头有点紧,但是没什么可以抵押的,所以能不能申请无抵押贷款?大学生不能申请无抵押贷款,因为你没有足够的还款能力,但是大学生可以申请助学贷款。大学生助学贷款一般有两类:国家助学贷款和生源地信用助学贷款。国家助学贷款是由政府主导、财政贴息,银行、教育行政部门与高校共同操作的专门帮助高校贫困家庭学生的银行贷款。生源地信用助学贷款是指国家开发银行向符合条件的家庭经济困难的普通高校新生和在...

  • 请,西安本市户口在西安购买二手房,按揭贷款如何申请?

    请,西安本市户口在西安购买二手房,按揭贷款如何申请?

    贷款,按揭,购买,借款人,方案,想在西安申请按揭贷款买房,但是有些地方不太懂,请问可以详细解答一下吗?个人购买二手房申请按揭贷款的流程如下:1、 确定按揭服务公司和贷款方案。借款人在办理贷款前首先需要与中介确定按揭服务公司,并向按揭服务公司提出贷款咨询,确定贷款方案。2、 查询公积金(若个人需公积金贷款)。与卖方确定购房意向后,借款人提供公积金帐号,由按揭服务公司进行公积金查询,确定可贷款的金额和贷款年限。3、签定房屋买卖合同。借款人与卖...

  • 贷款买车对借款人有年龄要求吗?

    贷款买车对借款人有年龄要求吗?

    贷款,银行,年龄,借款人,设置,没满十八是不是不能申请?你好,买车贷款是有年龄限制的,要求年龄在18岁以上,且年龄加上贷款期限小于65周岁。银行设置年龄限制是考虑了借款人的还款能力的,年龄太小的没有正式工作,没有稳定的收入,年龄大的退休了一般也没有工作。所以银行一定要考虑到这一点。除此之外,银行还对贷款买车的额度和期限有所规定,一般来说,贷款金额最高一般不超过所购汽车售价的80%。汽车消费贷款期限一般为1-3年,最长不超过5年。...

  • 生源地贷款如何还款?

    生源地贷款如何还款?

    贷款,账户,登录,服务,支付宝,具体怎么操作?你好,具体流程如下:首先,登陆国家开发银行,生源地助学贷款网站,查询自己的欠款。每年除11月外的每月10日前,学生联系县(市、区)资助中心或登录国家开发银行学生在线服务系统,提出提前还款申请;确定之后将还款资金打入还款账户或支付宝账户;国开行将在当月20日前,通知银行或支付宝进行扣款;次月1日借款学生科登录学生在线服务系统查询还款结果,若还款未成功,可在下月继续提交提前还款申请。...

  • 如何申请免息汽车贷款?

    如何申请免息汽车贷款?

    贷款,利率,操作流程,交付,优惠,我听说有一种汽车贷款是不需要利息的,他是免息贷款,请问这种车贷要如何才能申请呢?有什么要求呢?是有着一种免息贷款的方式,他的贷款期限大概为三年以内,而且他是针对车价无优惠的车,操作流程长、提车时间相对较长等。更重要的是,有的所谓零利率,还需要手续费,一般需要车主交付贷款额的3%至9%。你需要提供以下手续:个人有效身份证件;户籍证明或长期居住证明(居住证明可以提供如水电、电话账单等);个人收入证明,必要时须...

  • 招商银行小额信用贷款如何办理?

    招商银行小额信用贷款如何办理?

    证明,贷款,信用,查询结果,财力,我想申请招行信用卡小额贷款,请问需要满足什么条件?都有什么要求呢?谢谢回答!招商银行小额信用贷款的申请材料为:1.身份证、结婚证明或户口本2.营业执照、组织机构代码证、公司章程(或工商登记信息查询结果)3.资产或其他财力证明4.经营场所证明5.用途证明【任选其一】:购销合同、采购订单、发票等。...

  • 没有工资流水单可以申请小额贷款吗?

    没有工资流水单可以申请小额贷款吗?

    工资,证明,收入,金额,情况,你好,我是一名农民工,在建筑工地干活,家在兰州,想贷三万元无抵押贷款,没有工资流水单,可以吗?申请小额贷款是需要工资流水的,因为你要证明你有固定的收入来还银行贷款。工资发现金的人,比如你的情况,你可以提前自存流水。操作起来很简单,就是在每月固定的那一天,存入金额相同的资金,这也相当于你的工资流水。存了之后照常的进行消费就行。你养成这样的习惯,银行发新你有固定的收入,贷给你款就容易些。...

  • 金华的公积金贷款额度大概为多少?

    金华的公积金贷款额度大概为多少?

    额度,设置,抵押物,价值,经济,你好,坐标金华,想用公积金申请住房贷款,请问大概能贷多少额度呢?我是首套房,之前也没有申请过贷款。不高于经济适用房价的70%;首套住房价款的60%、二套住房价款的40%;用其他房屋设置抵押,同时不高于抵押物价值的50%。最高贷款额分别为:夫妻双方均正常缴存住房公积金的为60万元;职工单方正常缴存住房公积金的为30万元;职工住房公积金月缴存额高于1000元(含)或缴存工资基数高于4000元(含)的,贷款最高限...

  • 国家开发银行助学贷款网站上申请还款流程操作是什么?

    国家开发银行助学贷款网站上申请还款流程操作是什么?

    借款人,操作,提交,系统,本息,你好楼主,还款操作如下:每年除11月外每月的1-10日借款人(共同借款人)县级学生资助管理中心或者登录学生在线服务系统提交提前还款申请,提交申请时即可查看应还本息金额。借款人(共同借款人)在申请提前还款月份的15号之前,将应还资金存入指定账户。如还款账户为邮储的,存入对应的邮储存折;如还款账户为支付宝,请将应还资金充值进支付宝或直接使用支付宝还款功能进行还款。借款人(共同借款人)从次月1日起,可登录学生在线服...

  • 以前住房公积金贷款有逾期,但是去年一次还清了,现在还能

    以前住房公积金贷款有逾期,但是去年一次还清了,现在还能

    贷款,审核,信用,情况,连续,影响我现在贷款吗?会不会贷不到?你好,建议你去当地人行查询一下自己的征信情况。是否影响贷款,具体要看您逾期的情况。现在审核部门通常审核会比较注重申请人近两年的信用记录是否有出现“连三累六”的记录,即近两年信用记录是否有出现连续逾期三个月以上或者累计逾期六个月以上的记录。如果你之前逾期没有超过六个月以上的话,应该是不会影响贷款的。...

  • 正在按揭的房子,是否可以继续贷款?

    正在按揭的房子,是否可以继续贷款?

    公司,担保,正规,贷款,按揭,本人前些日子按揭购买了一套房子,没还完带苦啊你,目前急用钱,请问可以抵押这房子来护额的贷款吗?根据你的情况,如果抵押人想要使用房产办理抵押贷款,这是可以的,具体的操作方法有很多种,我跟你讲一下最常用的一种,可以找到正规的担保公司进行预付款,其操作流程如下:第一步:在当地找一家正规的担保公司第二步:将相关程序提交担保公司进行商谈第三步:借款人与银行签订贷款还款协议第四步:与担保公司签订托运协议第五步:银行审批第...