共计 4268 个字符,预计需要花费 11 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关 MySQL 中怎么配置参数优化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
Mysql 参数优化对于新手来讲,是比较难懂的东西,其实这个参数优化,是个很复杂的东西,对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果。
下面先说我的服务器的硬件以及论坛情况,
CPU: 2 颗四核 Intel Xeon 2.00GHz
内存: 4GB DDR
硬盘: SCSI 146GB
论坛:在线会员 一般在 5000 人左右 – 最高记录是 13264.
下面,我们根据以上硬件配置结合一份已经做过一次优化的 my.cnf 进行分析说明:有些参数可能还得根据论坛的变化情况以及程序员的程序进行再调整。
[mysqld]
port = 3306
serverid = 1
socket = /tmp/mysql.sock
skip-locking # 避免 MySQL 的外部锁定,减少出错几率增强稳定性。skip-name-resolve
禁止 MySQL 对外部连接进行 DNS 解析,使用这一选项可以消除 MySQL 进行 DNS 解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用 IP 地址方式,否则 MySQL 将无法正常处理连接请求!
back_log = 500
要求 MySQL 能有的连接数量。当主要 MySQL 线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间 (尽管很短) 检查连接并且启动一个新线程。
back_log 值指出在 MySQL 暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加 它,换句话说,这值对到来的 TCP/IP 连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定 back_log 高于你的操作系统 的限制将是无效的。当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是 50,我把它改为 500。
key_buffer_size = 384M
# key_buffer_size 指定用于索引的缓冲区大小,增加它可得到更好处理的索引 (对所有读和多重写),到你能负担得起那样多。如果你使它太大,系 统将开始换页并且真的变慢了。对于内存在 4GB 左右的服务器该参数可设置为 384M 或 512M。通过检查状态值 Key_read_requests 和 Key_reads, 可以知道 key_buffer_size 设置是否合理。比例 key_reads / key_read_requests 应该尽可能的低,至少是 1:100,1:1000 更好(上述状态值可以使用 SHOW STATUS LIKE lsquo;key_read% rsquo; 获得)。注意:该参数值设置的过大反而会是服务器整体效率降低!
max_allowed_packet = 32M
增加该变量的值十分安全,这是因为仅当需要时才会分配额外内存。例如,仅当你发出长查询或 mysqld 必须返回大的结果行时 mysqld 才会分配更多内 存。该变量之所以取较小默认值是一种预防措施,以捕获客户端和服务器之间的错误信息包,并确保不会因偶然使用大的信息包而导致内存溢出。
table_cache = 512
table_cache 指定表高速缓存的大小。每当 MySQL 访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表 内容。通过检查峰值时间的状态值 Open_tables 和 Opened_tables,可以决定是否需要增加 table_cache 的值。如果你发现 open_tables 等于 table_cache,并且 opened_tables 在不断增长,那么你就需要增加 table_cache 的值了(上述状 态值可以使用 SHOW STATUS LIKE lsquo;Open%tables rsquo; 获得)。注意,不能盲目地把 table_cache 设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能 不稳定或者连接失败。
sort_buffer_size = 4M
查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占! 如果有 100 个连接,那么实际分配的总共排序缓冲区大小为 100 times; 4 = 400MB。所以,对于内存在 4GB 左右的服务器推荐设置为 4 -8M。
read_buffer_size = 4M
读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!
join_buffer_size = 8M
联合查询操作所能使用的缓冲区大小,和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享!
myisam_sort_buffer_size = 64M
MyISAM 表发生变化时重新排序所需的缓冲
query_cache_size = 64M
指定 MySQL 查询缓冲区的大小。可以通过在 MySQL 控制台执行以下命令观察:
# SHOW VARIABLES LIKE %query_cache% # SHOW STATUS LIKE Qcache% # 如果 Qcache_lowmem_prunes 的值非常大,则表明经常出现缓冲不够的情况;
如果 Qcache_hits 的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。
thread_cache_size = 64
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能 可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用
tmp_table_size = 256M
max_connections = 1000
指定 MySQL 允许的最大连接进程数。如果在访问论坛时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。
max_connect_errors = 10000000
对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST;。
wait_timeout = 10
指定一个请求的最大连接时间,对于 4GB 左右内存的服务器可以设置为 5 -10。
thread_concurrency = 8
该参数取值为服务器逻辑 CPU 数量 times;2,在本例中,服务器有 2 颗物理 CPU,而每颗物理 CPU 又支持 H.T 超线程,所以实际取值为 4 times; 2 = 8
skip-networking
开启该选项可以彻底关闭 MySQL 的 TCP/IP 连接方式,如果 WEB 服务器是以远程连接的方式访问 MySQL 数据库服务器则不要开启该选项! 否则将无法正常连接!
long_query_time = 10
log-slow-queries =
log-queries-not-using-indexes
开启慢查询日志(slow query log)
慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过 long_query_time 的查询,如果需要,还可以记录不使用索引的记录。下面是一个慢查询日志的例子:
开启慢查询日志,需要设置参数 log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries 指定日志文件,如果不提供文件名,MySQL 将自己产生缺省文件名。long_query_times 指定慢查询的阈 值,缺省是 10 秒。log-queries-not-using-indexes 是 4.1.0 以后引入的参数,它指示记录不使用索引的查询。设置 long_query_time=10
另外附上使用 show status 命令查看 mysql 状态相关的值及其含义:
使用 show status 命令
含义如下:
aborted_clients 客户端非法中断连接次数
aborted_connects 连接 mysql 失败次数
com_xxx xxx 命令执行次数, 有很多条
connections 连接 mysql 的数量
Created_tmp_disk_tables 在磁盘上创建的临时表
Created_tmp_tables 在内存里创建的临时表
Created_tmp_files 临时文件数
Key_read_requests The number of requests to read a key block from the cache
Key_reads The number of physical reads of a key block from disk
Max_used_connections 同时使用的连接数
Open_tables 开放的表
Open_files 开放的文件
Opened_tables 打开的表
Questions 提交到 server 的查询数
Sort_merge_passes 如果这个值很大, 应该增加 my.cnf 中的 sort_buffer 值
Uptime 服务器已经工作的秒数
提升性能的建议:
1. 如果 opened_tables 太大, 应该把 my.cnf 中的 table_cache 变大
2. 如果 Key_reads 太大, 则应该把 my.cnf 中 key_buffer_size 变大. 可以用 Key_reads/Key_read_requests 计算出 cache 失败率
3. 如果 Handler_read_rnd 太大, 则你写的 SQL 语句里很多查询都是要扫描整个表, 而没有发挥索引的键的作用
4. 如果 Threads_created 太大, 就要增加 my.cnf 中 thread_cache_size 的值. 可以用 Threads_created/Connections 计算 cache 命中率
5. 如果 Created_tmp_disk_tables 太大, 就要增加 my.cnf 中 tmp_table_size 的值, 用基于内存的临时表代替基于磁盘的
上述就是丸趣 TV 小编为大家分享的 MySQL 中怎么配置参数优化了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。