MySQL变量的概念个人认为可以理解为MySQL在启动或运行时读取的一些参数,并利用这些参数启动服务,响应或支持用户请求和其他变量如果配置要长期使用,应该写入配置文件而不是在***中指定,因为***中设置的变量会随着重启MySQL服务。另外,需要注意设置的变量是否为当前Session变量或Global变量。不同的变量单位有不同的单位。比如table_cache是??指缓存表的个数,而key_buffer_size是以字节为单位的。还有以页数或百分比为单位的变量。很多变量可以用后缀表示,比如1M表示一百万字节,在配置文件或者命令行中有效,但是使用set命令时,这些单位无效,必须使用数字,单位是字节。例如:set@@session.sort_buffer_size=1024*1024orset@@session.sort_buffer_size=1048576但是expression变量的作用域在配置文件中设置的时候是不能用的有些变量在server级别,有些在server级别Session级别的,有的是对象级别的。许多会话变量等于全局变量,可以是默认值。如果更改会话级变量,它只会影响当前会话。当前Session关闭后,当前设置的参数将失效。例子:query_cache_size是全局级别,sort_buffer_size可以全局设置,每个Session也可以独立设置join_buffer_size可以全局设置,也可以在Session级别设置。如果一个查询中有多个表关联,除了在配置文件中设置变量外,还可以为每个关联分配一个joinbuffer。,(有些变量)也可以在运行时修改,MySQL称之为动态配置变量如: setglobalsort_buffer_size=1024*1024*1024setsort_buffer_size=1024*1024*1024set@@sort_buffer_size=1024*1024*1024set@@session.sort_buffer_size=1024*1024*1024set@@global.sort_buffer_size=1024*1024*1024公共变量设置和获取资源说明:key_buffer_size分配所有指定的keybuffer(keybuffer,也叫keycache)空间,操作系统不会立即为这个设置分配内存,而是等到它被使用。table_cache_size当一个线程打开一个表时,MySQL将检查这个标量的值。如果大于缓存中的表数,线程可以将最后打开的表放入缓存中。如果该值小于缓存中的表数,MySQL将从缓存中移除不常用的表thread_cache_size当连接关闭时,MySQL会检查缓存中是否有空间来缓存线程。如果有:缓存的线程已经被下一个连接重用如果没有:会销毁线程,不再缓存,缓存中使用的线程数不会立即减少,只有新连接删除缓存中的一个线程而且不会用后会减少。MySQL只在连接关闭时在缓冲区中增加或减少线程,在创建新连接时从缓存中删除线程query_cache_size当MySQL启动时,一次性分配并初始化这块内存。如果修改这个变量(即使设置为与当前值相同的值)MySQL会立即删除所有缓存的查询,重新分配缓存到指定的大小,并重新初始化内存read_buffer_sizeMySQL只会在查询需要它,并且会一次性分配参数read_rnd_buffer_size指定大小的所有内存MySQL只会在查询需要的时候为缓存分配内存,并且只分配需要的内存大小,而不是指定大小的所有内存应该调用,max_read_rnd_buffer_sizesort_buffer_sizeMySQL只有在查询需要做排序操作时才会被调用销毁并为缓存分配内存。一旦需要排序,MySQL会立即分配参数指定大小的所有内存,而不管排序是否需要这么大的内存。可以看出,在未使用的变量、设置后的激活时间、激活原理、生效方式等方面都存在一定差异。设置变量的潜在影响动态设置全局变量会导致意想不到的副作用。有些变量在更改后会立即生效,比如从缓冲区中刷新被盗的块,这会导致服务器相应的请求出现一些不稳定甚至更严重的问题。
