Chinaunix首页 | 论坛 | 博客
  • 博客访问: 670707
  • 博文数量: 53
  • 博客积分: 830
  • 博客等级: 准尉
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-31 18:23
文章存档

2019年(1)

2018年(1)

2016年(1)

2015年(1)

2014年(12)

2013年(4)

2012年(33)

分类: Mysql/postgreSQL

2012-04-06 10:16:48

                        mysql进阶1
   关于mysql调优通常有三种方法:
   1.替换有问题的硬件。
   2.对mysqld进程调优。
   3.对查询进行优化。

我们本章只对mysql进程调优。

一.记录慢速查询:
  • /etc/my.cnf增加如下内容:  
    (注意对应目录的权限与db用户,
    建议: 
        [root@user61 lib]# chown -R root:root mysql
        [root@user61 lib]# chown -R 777 mysql

        log_slow_queries      =ON
        #log-slow-queries        = /var/lib/mysql/slow-queries.log
        log-slow_queries        = /var/lib/mysql/slow-queries.log
        long_query_time         = 3
        log-queries-not-using-indexes
        log-slow-admin-statements

        log-error=/var/lib/mysql/error.log
        log=/var/lib/mysql/mysql.log

可以用多种工具:mysqldumpslow,
myprofi,mysqlsla

二.查询进行缓存
 query_cache_size=32M 添加到/etc/my.conf中可以启用32MB查询缓存。

一下解释:
Qcache_free_blocks: 缓存中相邻内存的个数。数目大说明可能有碎片。
qcache_free_memory:缓存中的空闲内存。
qcache_hits:每次查询在缓存中命中时就增大。
qcache_inserts:每次插入一个时就增大。上表缓存命中为:0,命中次数除以插入次数就是不命中比率,1-这个值就是命中率
qcache_lowmem_prunes:缓存出现内存不足并且必须清理以便为更多查询提供空间的次数,如果这个数字在不断增长,可能碎片非常严重,或内存很少(free_blocks,free_memory可以判断)
qcache_not_cached:不适合进行缓存的查询的数量(通常不是select语句)
qcache_queries_in_cache:当前缓存的查询(和响应)的数量;
qcache_total_blocks:缓存中块的数量。
注意:如果flush query cache占用了很长时间,就说明缓存大了。

三. 强制限制
 在my.conf中添加:                              
set-variable=max_connections=500            (1)
set-variable=wait_time=10                           (2)
max_connect_errors=100                              (3)

(1)服务器允许客户端的连接数,可以查询目前建立过最大连接数为:show status like 'max_used_connections'
(2)意味着mysqld终止所有空闲超过10秒的连接。
(3)如果clinet连接mysql100次不成功,mysql将锁定clinet直到flush hosts之后才运行。

四.缓存
4.1缓存表:
mysql客队表进行缓存: /etc/mysqld.conf中的table_cache指定

mysql> show status like 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 8     |
| Opened_tables | 0     |
+---------------+-------+
2 rows in set (0.00 sec)

说明:目前已打开8张表,有0张需要打开。如果show status命令快速增加,说明缓存命中率不够,如果open_tables比table_cache设置小很多,就说明值太大了。

4.2缓存线程
mysql> show status like 'threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 2     |              (1)
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.00 sec)

(1)说明每次mysqld需要创建一个新线程,此值都会增加,show  status 命令发现次值快速增加,
可作如下操作: my.cnf中使用thread_cache=40来实现。

4.2磁盘请求
mysql> show status like '%key_read%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_read_requests | 0     |         (1)
| Key_reads         | 0     |               (2)      
+-------------------+-------+
2 rows in set (0.00 sec)

说明:
(2) 代表命中磁盘的请求个数。
(1)磁盘的请求个数的总数。
公式1=(2)/(1)为不命中录。
公式2=(1-公式1)为命中录。
如果每1000个请求中命中磁盘的数目超过1个,则应增大缓冲了,如:key_buffer=38MB

4.3 临时表的使用:
mysql> show status like 'created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |      (1)
| Created_tmp_files       | 0     |           (2)
| Created_tmp_tables      | 0     |         (3)
+-------------------------+-------+
3 rows in set (0.00 sec)

说明:
(3)每次使用临时表都会增大created_tmp_disk_tables
(2)基于磁盘的表也会增大created_tmp_disk_tables
可以控制: my.cnf中对两值进行设置

4.4 显示排序统计信息:  (统计排序时的磁盘活动)

mysql> show status like 'sort%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Sort_merge_passes | 0     |   (1)
| Sort_range        | 0     |
| Sort_rows         | 0     |
| Sort_scan         | 0     |
+-------------------+-------+
4 rows in set (0.00 sec)

说明:
(1)如果sort_merge_passes状态变量很大,指示了磁盘的活动情况。须注意sort_buffer_size,my.cnf可设置

4.5表扫描比录:
mysql> show status like 'com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 0     |            (1)
+---------------+-------+
1 row in set (0.00 sec)

mysql> show status like 'handler_read_rnd_next';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_rnd_next | 0     |      (2)
+-----------------------+-------+
1 row in set (0.00 sec)

说明:
表扫描比录=(1)/(2)

如果值超过4000设置:read_buffer_size,如:
read_buffer_size=4M,如果超过8MB,进行调优在my.cnf中


四.工具介绍:
1.mytop
%E7%9B%91%E6%8E%A7%E5%B7%A5%E5%85%B7-mytop.html

2.mysqlard


3.mysqlreport
http://www.chedong.com/blog/archives/001451.html

阅读(1171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~