MySQL参数介绍

**mysql设置utf8字符集**
show variables like '%char%';                    查看字符集
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
临时修改
set global character_set_database = 'utf8';
set global character_set_server = 'utf8';
永久修改
修改mysql配置文件/etc/my.cnf。

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

**max_connections**
show variables like '%max_connections%';               mysql可使用连接数
show global status like 'Max_used_connections';        同一时刻并行连接的最大值
set global max_connections=200;                    设置可用连接数
show full processlist;                                连接详细信息

**key_buffer_size**        **--对MyISAM表性能影响很大**
show variables like 'key_buffer_size';                    查看键缓冲大小
set global key_buffer_size = 1024*1024*512            修改键缓冲大小,表示512M
show global status like 'key_read%';                    查看使用情况
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| Key_read_requests | 14421288 |        总共索引读取请求
| Key_reads         | 98774    |        在内存中没找到直接从硬盘读取
+-------------------+----------+
索引未命中缓存的概率:
*key_cache_miss_rate = Key_reads / Key_read_requests * 100%
key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在0.01%以下的话,key_buffer_size分配的过多,可以适当减少。
show global status like 'key_blocks_u%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Key_blocks_unused | 419421 |      表示未使用的缓存簇(blocks)数
| Key_blocks_used   | 102969 |        表示曾经用到的最大的blocks数
+-------------------+--------+
key_blocks_unused为0的话,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了比较理想的设置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%*

**sort_buffer_size**
show variables like '%sort_buffer%';                    查看sort缓冲大小
set global sort_buffer_size = 1024*1024;               修改sort缓冲大小,表示1M

**read_buffer_size**
show variables like '%read_buffer%';                    查看read缓冲大小
set global read_buffer_size = 1024*1024;            修改read缓冲大小,表示1M

**read_rnd_buffer_size**                            
show variables like 'read%buffer_size';                查看随机读缓冲大小
set global read_rnd_buffer_size = 1024*1024;        修改

**join_buffer_size**
show variables like 'join_buffer%';                    查看join缓冲大小
set global join_buffer_size = 1024*1024*2;            修改join缓冲大小,表示2M

**tmp_table_size**
show variable like 'tmp%size';                        查看临时表大小
set global tmp_table_size = 1024*1024*12;            修改临时表大小
show variables like "tmpdir";                            超出定义临时表的大小之后产生的临时表存放目录
show global status like 'created_tmp%';
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Created_tmp_disk_tables | 21325   |
| Created_tmp_files       | 18      |
| Created_tmp_tables      | 5018977 |
+-------------------------+---------+
创建临时表,Created_tmp_tables 就会增加,临时表大小超过tmp_table_size值,则是在磁盘上创建,Created_tmp_disk_tables会增加,Created_tmp_files表示MySQL服务创建的临时文件文件数
较合理的配置:Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

**max_heap_table_size**
show variables like '%table%size';                查看大小
set global max_heap_table_size = 1024*1024;    修改大小
比tmp_table_size小时,系统会把max_heap_table_size的值作为最大的内存临时表的上限,大于这个时,改写硬盘。

**thread_cache_size**
show variables like 'thread_cache_size';            查看线程缓存值
set global thread_cache_size = 32;                修改
show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 16    |                    缓存的连接数        
| Threads_connected | 114   |                当前连接数
| Threads_created   | 147   |                    创建过的线程数
| Threads_running   | 1     |                    当前运行
+-------------------+-------+

**thread_concurrency**
show variables like 'thread_concurrency';        查看线程最大并发,只读变量,不支持动态修改

**query_cache_size**
show variables like 'have_query_cache';            表示这个mysql版本是否支持查询缓存
show variables like 'query_cache_size';            查看查询缓存值
show variables like 'query_cache_limit';            表示单个结果集所被允许缓存的最大值
show variables like 'query_cache_type';            查看查询缓存是否开启,0表示关闭(OFF),1表示开启(ON),2表示只要select 中明确指定SQL_CACHE才缓存
show variables like 'query_cache_min_res_unit';        每个被缓存的结果集要占用的最小内存,默认为4K
show status like 'Qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 386      |        表示查询缓存中目前还有多少剩余的blocks,如果该值显示较大,则说明查询缓存中的内存碎片过多了
| Qcache_free_memory      | 24510576 |        查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用
| Qcache_hits             | 1672463  |            表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
| Qcache_inserts          | 3621367  |            查询缓存插入的次数,缓存的命中率为 Qcache_hits/(Qcache_hits+Qcache_inserts)
| Qcache_lowmem_prunes    | 32520    |        有多少条查询因为内存不足而被移除出查询缓存,通过这个值,用户可以适当的调整缓存大小
| Qcache_not_cached       | 45672302 |        表示因query_cache_type的设置而没有被缓存的查询数量
| Qcache_queries_in_cache | 4963     |        当前缓存中缓存的查询数量
| Qcache_total_blocks     | 10886    |            当前缓存的block数量
+-------------------------+----------+
合适的query_cache_min_res_unit可以减少碎片,这个参数最合适的大小和应用程序查询结果的平均大小直接相关,可以通过内存实际消耗(query_cache_size - Qcache_free_memory)除以Qcache_queries_in_cache计算平均缓存大小。可以通过Qcache_free_blocks来观察碎片,这个值反应了剩余的空闲块,如果这个值很多,但是
Qcache_lowmem_prunes却不断增加,则说明碎片太多了。可以使用flush query cache整理碎片,重新排序,但不会清空,清空命令是reset query cache。整理碎片期间,查询缓存无法被访问,可能导致服务器僵死一段时间,所以查询缓存不宜太大。
提高查询缓存的使用率:
如果碎片不是问题,命中率却非常低,可能是内存不足,可以通过 Qcache_free_memory 参数来查看没有使用的内存。
如果2者都没有问题,命中率依然很低,那么说明缓存不适合你的当前系统。可以通过设置
query_cache_size = 0或者query_cache_type 来关闭查询缓存。

**table_open_cache**
show global status like 'open%tables%';    
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 7091  |                    --缓存中的表
| Opened_tables | 29660                 --累计打开过的表|
+---------------+-------+
            
show variables like '%table_open_cache%';          查看设置的可缓存表大小
set global table_open_cache = 300;  
table_cache过大的话,使得mysql对SQL响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的table_cache值。

**show status like 'Threads%';**
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 30    |            --缓存中的线程数,过大时可以适当增加thread_cache_size的值
| Threads_connected | 100   |          --打开的连接数
| Threads_created   | 147   |
| Threads_running   | 1     |               --激活的连接数
+-------------------+-------+

**open-files-limit**
show variables like 'open%';            mysql能够打开的文件数量
show global status like 'open%file%';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Open_files    | 10545  |                系统当前打开的文件数
| Opened_files  | 183037 |            系统打开过的总文件数
+---------------+--------+
比较合适的设置:Open_files / open_files_limit * 100% <= 75%

**slow_query_log**
slow_query_log=1       是否启用慢查询日志,1为启用,0为禁用
slow_query_log_file=slow.log       指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datadir目录
long_query_time=2     SQL语句运行时间阈值,执行时间大于参数值的语句才会被记录下来
此段原文链接:https://blog.csdn.net/u014044812/article/details/78924315       作者:昌昌93
Query Cache 如何处理子查询的?
这是我遇到的最为常见的一个问题。其实 Query Cache 是以客户端请求提交的 Query 为对象来处理的,只要客户端请求的是一个 Query,无论这个 Query 是一个简单的单表查询还是多表 Join,亦或者是带有子查询的复杂 SQL,都被当作成一个 Query,不会被分拆成多个 Query 来进行 Cache。所以,存在子查询的复杂 Query 也只会产生一个Cache对象,子查询不会产生单独的Cache内容。UNION[ALL] 类型的语句也同样如此。
Query Cache 是以 block 的方式存储的数据块吗?
不是,Query Cache 中缓存的内容仅仅只包含该 Query 所需要的结果数据,是结果集。当然,并不仅仅只是结果数据,还包含与该结果相关的其他信息,比如产生该 Cache 的客户端连接的字符集,数据的字符集,客户端连接的 Default Database等。
Query Cache 为什么效率会非常高,即使所有数据都可以 Cache 进内存的情况下,有些时候也不如使用 Query Cache 的效率高?
Query Cache 的查找,是在 MySQL 接受到客户端请求后在对 Query 进行权限验证之后,SQL 解析之前。也就是说,当 MySQL 接受到客户端的SQL后,仅仅只需要对其进行相应的权限验证后就会通过 Query Cache 来查找结果,甚至都不需要经过 Optimizer 模块进行执行计划的分析优化,更不许要发生任何存储引擎的交互,减少了大量的磁盘 IO 和 CPU 运算,所以效率非常高。
客户端提交的 SQL 语句大小写对 Query Cache 有影响吗?
有,由于 Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以必须要整个 SQL 语句在字符级别完全一致,才能在 Query Cache 中命中,即使多一个空格也不行。
一个 SQL 语句在 Query Cache 中的内容,在什么情况下会失效?
为了保证 Query Cache 中的内容与是实际数据绝对一致,当表中的数据有任何变化,包括新增,修改,删除等,都会使所有引用到该表的 SQL 的 Query Cache 失效。
为什么我的系统在开启了 Query Cache 之后整体性能反而下降了?
当开启了 Query Cache 之后,尤其是当我们的 query_cache_type 参数设置为 1 以后,MySQL 会对每个 SELECT 语句都进行 Query Cache 查找,查找操作虽然比较简单,但仍然也是要消耗一些 CPU 运算资源的。而由于 Query Cache 的失效机制的特性,可能由于表上的数据变化比较频繁,大量的 Query Cache 频繁的被失效,所以 Query Cache 的命中率就可能比较低下。所以有些场景下,Query Cache 不仅不能提高效率,反而可能造成负面影响。
如何确认一个系统的 Query Cache 的运行是否健康,命中率如何,设置量是否足够?
MySQL 提供了一系列的 Global Status 来记录 Query Cache 的当前状态,具体如下:
Qcache_free_blocks:目前还处于空闲状态的 Query Cache 中内存 Block 数目
Qcache_free_memory:目前还处于空闲状态的 Query Cache 内存总量
Qcache_hits:Query Cache 命中次数
Qcache_inserts:向 Query Cache 中插入新的 Query Cache 的次数,也就是没有命中的次数
Qcache_lowmem_prunes:当 Query Cache 内存容量不够,需要从中删除老的 Query Cache 以给新的 Cache 对象使用的次数
Qcache_not_cached:没有被 Cache 的 SQL 数,包括无法被 Cache 的 SQL 以及由于 query_cache_type 设置的不会被 Cache 的 SQL
Qcache_queries_in_cache:目前在 Query Cache 中的 SQL 数量
Qcache_total_blocks:Query Cache 中总的 Block 数量
可以根据这几个状态计算出 Cache 命中率,计算出 Query Cache 大小设置是否足够,总的来说,我个人不建议将 Query Cache 的大小设置超过256MB,这也是业界比较常用的做法。
MySQL Cluster 是否可以使用 Query Cache?
其实在我们的生产环境中也没有使用 MySQL Cluster,所以我也没有在 MySQL Cluster 环境中使用 Query Cache 的实际经验,只是 MySQL 文档中说明确实可以在 MySQL Cluster 中使用 Query Cache。从 MySQL Cluster 的原理来分析,也觉得应该可以使用,毕竟 SQL 节点和数据节点比较独立,各司其职,只是 Cache 的失效机制会要稍微复杂一点

**bulk_insert_buffer_size**        --针对myisam引擎,默认8M,大数据导入的话可以调大该值
show variables like 'bulk_insert%';            查看大小
set global buli_insert_buffer_size = 1024*1024              修改大小

**myisam_sort_buffer_size**
在修复表中对MyISAM索引进行排序或使用CREATE INDEX或ALTER TABLE创建索引时分配的缓冲区大小。
show variables like 'myisam_sort_buffer_size';            查看大小

**myisam_max_sort_file_size**
show variables like 'myisam_max_sort_file_size';            查看大小
MySQL在重新创建MyISAM索引(在修复表、更改表或加载数据INFILE期间)时允许使用的临时文件的最大大小。如果文件大小大于这个值,则使用键缓存来创建索引,这样比较慢。该值以字节为单位给出

**myisam_recover**
自动检查和修复未正确关闭的MyISAM表
myisam-recover=backup,force

**innodb_buffer_pool_size**
show variables like 'innodb_buffer_pool_size';        查看大小
show status like 'innodb_buffer_pool_pages_data';                      包含数据的InnoDB缓冲池中的页面数。这个数字包括脏页和干净页。
show global status like 'Innodb_buffer_pool_pages_total';            以页为单位的InnoDB缓冲池的总大小
show global status like 'Innodb_page_size';                InnoDB页面大小(默认为16KB)。许多值是在页面中计算的;页面大小可以方便地将它们转换为字节
计算Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total*100%
当结果 > 95% 则增加 innodb_buffer_pool_size, 建议使用物理内存的 75%
当结果 < 95% 则减少 innodb_buffer_pool_size,
建议设置大小为: Innodb_buffer_pool_pages_data* Innodb_page_size * 1.05 / (1024*1024*1024)
set global innodb_buffer_pool_size = 1024 * 1024 * 1024  * 2    (2G)
    
**innodb_write_io_threads = 4          innodb_read_io_threads = 4**
默认都是4,不支持动态修改,改动需要到配置文件中加上该参数

**mysql used mem =key_buffer_size + query_cache_size + tmp_table_size
 innodb_buffer_pool_size + innodb_additional_mem_pool_size
 innodb_log_buffer_size
max_connections * (
read_buffer_size + read_rnd_buffer_size
sort_buffer_size+ join_buffer_size
binlog_cache_size + thread_stack
)**
http://www.mysqlcalculator.com/  MySQL内存计算器

每次都要百度来搜,所以自己写个笔记记录一下,有写的错误的地方欢迎大家指正
其中有一部分是参考网上的其他文章,东一点西一点,都要放原文链接的话那就太多了。。。。如有侵权,联系我会立即删除

欢迎大家转载

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值