MySQL 设置变量的副作用51CTO博客 - 凯时娱乐

MySQL 设置变量的副作用51CTO博客

2019-03-06 10:20:40 | 作者: 文昂 | 标签: 设置,变量,缓存 | 浏览: 336

动态设置变量或许导致意外的副作用,例如从缓冲中改写脏块。有必要当心那些能够在线更改的设置,由于它们或许导致数据库做许多的作业。

有时能够经过称号揣度一个变量的作用。例如,max_heap_table_size的作用就行听起来那样:它指定隐式内存暂时表最大答应的巨细。但是,命名的约好并不彻底相同,所以不能总是经过称号来猜想一个变量有什么作用。

让我们来看一些常用的变量和动态修正它们的作用:

key_buffer_size

  设置这个变量能够一次性为键缓冲区(也叫键缓存)分配一切指定的空间。但是,操作系统不会真的马上分配内存,而是到运用时才真实分配。例如设置键缓冲的巨细为1GB,并不意味着效劳器马上分配1GB的内存。

  MySQL答应创立多个键缓存。假如把非默许键缓存的这个变量设置为0,MySQL将丢掉存在该键缓存中的索引,转而运用默许键缓存,而且当不再有任何引证时会删去该键缓存。为一个不存在的键缓存设置这个变量,将会创立新的键缓存。对一个现已存在的键缓存设置非零值,会导致改写该键缓存的内容。这会堵塞一切测验拜访该键缓存的操作,知道改写操作完结。

table_cache_size

  设置这个变量不会当即收效---会延迟到下次有线程翻开表才有作用。当有线程翻开表时,MySQL会查看这个变量的值。假如大于缓存中的表的数量,线程能够把最新翻开的表放入缓存;假如值比缓存中的表小,MySQL将从缓存中删去不常运用的表。

thread_cache_size

  设置这个变量不会当即收效---将在下次衔接被封闭时发作作用。当有衔接被封闭时,MySQL查看缓存中是否还有空间来缓存线程。假如有空间,则缓存该线程以被下次衔接重用;假如没有空间,它将毁掉该线程而不再缓存。在这个场景中,缓存中的线程数,以及线程缓存运用的内存,并不会马上削减;只要在新的衔接删去缓存中的一个线程并运用后才会削减。(MySQL只在封闭衔接时才在缓存中添加线程,只在创立新衔接时才从缓存中删去线程。)

query_cache_size

  MySQL在发动的时分,一次性分配而且初始化这块内存。假如修正这个变量(即便设置为与其时相同的值),MySQL会马上删去一切缓存的查询,从头分配这片缓存到指定巨细,而且从头初始化内存。这或许花费较长的时刻,在完结初始化之前效劳器都无法供给效劳,由于MySQL是逐一整理缓存的查询,不是一次性悉数删掉。

read_buffer_size

  MySQL只会在有查询需求时才会为该缓存分配内存,而且会一次性分配该参数指定巨细的悉数内存。

read_rnd_buffer_size

  MySQL只会在有查询需求运用时才会为该缓存分配内存,而且只会分配需求的内存巨细而不是悉数指定的巨细。

sort_buffer_size

  MySQL只会在有查询需求做排序操作才会为该缓存分配内存。然后,一旦需求排序,MySQL就会马上分配该参数指定的巨细的悉数内存,而不论该排序是否需求这么大的内存。

这儿不是一个完好的参数列表,这儿的意图仅仅简略的通知我们,当修正一些常见的变量时,会有哪些希望的行为发作。

关于衔接等级的设置,不要轻易地在大局等级添加它们的值,除非承认这样做是对的。有一些缓存会一次性分配指定巨细的悉数内存,而不论实际上是否需求这么大,所以一个很大的大局设置或许导致糟蹋许多的内存。更好的办法是,当查询需求时在衔接等级独自调大这些值。

最常见的比如是sort_buffer_size,该参数操控排序操作的缓存巨细,应该在装备文件里把它装备的小一些,然后在某些查询需求排序时,再在衔接中把它调大。在分配内存后,MySQL会履行一些初始化的作业。

别的,即便是十分小的排序操作,排序缓存也会分配悉数的巨细的内存,所以假如把参数设置得超越均匀排序需求太多,将会糟蹋许多内存,添加额定的内存分配开支。许多读者以为内存分配是一个很简略的操作,听到内存分配的价值或许会很吃惊。不需求深化许多技术细节就能够将清楚为什么内存分配也是贵重的操作,内存分配包含了地址空间的分配,这相对来说是比较贵重的。特别是在Linux上,内存分配依据巨细运用多种开支不同的战略。

总的来说,设置很大的排序缓存价值或许十分高,所以除非断定必需要这么大,不然不要添加排序缓存的巨细。

假如查询有必要运用一个更大的排序缓存才干比较好地履行,能够在查询履行前添加sort_buffer_size的值,履行完结后康复DEFAULT。

eg:

SET @@session.sort_buffer_size := <value>;
#Execute the query
SET @@session.sort_buffer_size := DEFAULT;

能够将相似的代码封在函数中以方便运用。其它能够设置的单个衔接等级的变量有read_buffer_size,read_rnd_buffer_size,tmp_table_size,以及myisam_sort_buffer_size。

特别阐明:本文章是来自<High Performance MySQL>的一章节。

个人感悟:了解可动态更改的变量发作的影响是蛮重要的,一不当心,或许导致负载飞一般的暴升,CPU刷刷的飙升,乃至宕机。

糗事:自己曾在线上数据库动态修正query_cache_szie的值,原本server的负载都40-50的姿态啦,其时也不没考虑那么多,就直接改了,负载瞬间飙升到了200多,那个汗啊,,,

好的东西是拿出来共享的,那样它就会更美!!!

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯时娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章