mysql性能调优分为4个方面

一.硬件(CPU   内存   硬盘)监控CPU  内存 硬盘的值。
[root@fanxh ~]# top
top - 03:58:11 up 10:05,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 121 total,   1 running, 120 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.7%sy,  0.0%ni, 99.0%id,  0.0%wa,  0.0%hi,  0.3%si,  0.
Mem:   1004412k total,   922828k used,    81584k free,    70236k buffers
Swap:  2031608k total,        0k used,  2031608k free,   194964k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
  4341 root      20   0  565m  12m 1500 S  2.0  1.3   5:26.23 ndb_mgmd
     1 root      20   0 19356 1540 1228 S  0.0  0.2   0:01.38 init
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     4 root      20   0     0    0    0 S  0.0  0.0   0:01.32 ksoftirqd/0
     5 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0
     6 root      RT   0     0    0    0 S  0.0  0.0   0:00.09 watchdog/0
     7 root      20   0     0    0    0 S  0.0  0.0   0:32.77 events/0

二.网络(带宽)
三.服务本身问题 (mysqld)

    mysql体系结构

    连接池   sql接口     分析器  优化器   查询缓存   存储引擎    文件系统  管理工具

    一。设置mysql服务运行参数(软调优)

     mysql>   命令行下设置     选项=值;

     vim  /etc/my.cnf
    [mysqld]
    选项=值
    : wq

         1、数据库服务器并发连接数设置

mysql> show processlist;   查看当前连接线程的列表
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host      | db   | Command | Time | State | Info             |
+----+------+-----------+------+---------+------+-------+------------------+
|  1 | root | localhost | NULL | Query   |    0 | init  | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.00 sec)


 mysql> show variables like "max_connections"; 查看数据库默认 的最大并发连接数 +-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.17 sec)


mysql> set GLOBAL  max_connections=300;设置默认的最大并发连接数

mysql> show variables like "max_connections";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 300   |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> show global status like "max_used_connections";查看曾经有过的最大连接
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| Max_used_connections | 1     |
+----------------------+-------+
1 row in set (0.07 sec)

mysql> flush  status;  把max_used_connections的值清零从新计算

max_used_connections / max_connections  = 0.85    *   100%  ≈   85%
剩余的15%是为了应付突发访问。


如果想设置默认的最大连接使服务启动就生效,那么把它写入配置文件就可以。

vim   /etc/my.cnf
[mysqld]
max_connections=300
:wq

        2.连接数据库服务器“超时时间”设置
mysql  -hserver_ip  -uroot  -p123456

connect_timeout =10  (秒)  在获取链接时,等待握手的超时时间,只在登录时有效
mysql> show variables   like   "connect_timeout";    默认超时时间为10秒,一般不改
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| connect_timeout | 10    |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL   connect_timeout=7;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables   like   "connect_timeout";
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| connect_timeout | 7     |
+-----------------+-------+
1 row in set (0.00 sec)


wait_timeout = 28800  (秒) 服务器在关闭一个连接上等待行动的秒数  默认28800秒
mysql> show variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)

mysql> set wait_timeout=3600;
Query OK, 0 rows affected (0.02 sec)

mysql> show variables like "wait_timeout";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 3600  |
+---------------+-------+
1 row in set (0.01 sec)


3.   thread_cache_size可以重复使用的保存在缓存中线程的数量

mysql> show    variables    like    'thread_cache_size';可以重复使用的保存在缓存中线程的数量

什么是线程?线程是进程中的最小单元。

怎么判断thread_cache_size的值好不好?用show global status like 'Thread%';查看

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| thread_cache_size | 9     |
+-------------------+-------+
1 row in set (0.00 sec)
mysql> show global status like 'Thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |           越小越好

| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.03 sec)

4.  table_open_cache   所有线程打开表的数量,设置多少比较好用open%table%来查看。

mysql> show variables like "table_open_cache";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 2000  |
+------------------+-------+
1 row in set (0.00 sec)

mysql> show global status like "open%table%";
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Open_table_definitions   | 67    |
| Open_tables              | 60    |
| Opened_table_definitions | 67    |
| Opened_tables            | 67    |
+--------------------------+-------+
4 rows in set (0.00 sec)
用一下公式来计算来设置tables_open_cache的值。

Open_tables / table_open_cache=数字   *    100% <= 95%  
    60            /    2000   =num         *  100%    <=  95%   
 60     /     x   =0.95  *  100%    <=  95%

5.key_buffer_size =  8M    设置索引缓冲区的大小   (字节) 怎么设置合适的缓存?查看key_read%的值。

mysql> show variables like "key_buffer_size";
+-----------------+---------+
| Variable_name   | Value   |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
1 row in set (0.00 sec)


mysql> show global status like "key_read%";
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_read_requests | 0     |
| Key_reads         | 0     |
+-------------------+-------+
2 rows in set (0.00 sec)

sort_buffer_size = 512K        

  每个需要进行排序的线程分配该大小的缓冲区。增加此值加速order by或group by操作

mysql> show variables like "sort_buffer_size%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| sort_buffer_size | 262144 |
+------------------+--------+
1 row in set (0.00 sec)

read_buffer_size = 256K
从数据表顺序读取数据的读操作保留的缓存区的长度

mysql> show variables like "read_buffer_size%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| read_buffer_size | 131072 |
+------------------+--------+
1 row in set (0.00 sec)

read_rnd_buffer_size = 512K
按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果

mysql> show variables like "read_rnd_buffer_size%";
+----------------------+--------+
| Variable_name        | Value  |
+----------------------+--------+
| read_rnd_buffer_size | 262144 |
+----------------------+--------+
1 row in set (0.00 sec)
6.查询缓存的配置

mysql> show variables like "query_cache%";
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| query_cache_limit            | 1048576 |
| query_cache_min_res_unit     | 4096 
   |      拿出缓存的最小单元
| query_cache_size             | 1048576 |         查询缓存的大小
| query_cache_type             | OFF     |            查询缓存的类型
| query_cache_wlock_invalidate | OFF     |   当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。

+------------------------------+---------+
5 rows in set (0.00 sec)

query_cache_type    off     0   
                                 on      1
                                 DEMAND          2

0 或OFF 将阻止缓存或查询缓存结果。
1或ON 将允许缓存,  以SELECT SQL_NO_CACHE    开始的查询语句除外。
2或DEMAND ,仅对以SELECT SQL_CACHE 开始的那些查询语句启用缓存。
select SQL_CACHE  name,user  from webdb.user2;

开启缓存的命令写在配置文件中才能启用。


怎么设置缓存的参数?显示查询缓存的统计信息。

mysql> show   global    status    like   "qcache%";
+-------------------------+---------+
| Variable_name           | Value   |
+-------------------------+---------+
| Qcache_free_blocks      | 1       |
| Qcache_free_memory      | 1031368 |    缓存中的空内存
| Qcache_hits             | 0       |      每次查询在缓存中命中时就增大
| Qcache_inserts          | 0       |  每次 插入一个查询时就增大
| Qcache_lowmem_prunes    | 0       | 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数
| Qcache_not_cached       | 2       |    不合适进行缓存的查询的数量
| Qcache_queries_in_cache | 0       |   当前缓存的查询(和响应)的数量
| Qcache_total_blocks     | 1       |    缓存中块的数量
+-------------------------+---------+
8 rows in set (0.00 sec)

四.查询语句有问题

启动binlog日志进行对查询语句的错误

MySQL  有4种类型的日志 : 错误日志   binlog日志     查询日志   慢查询日志

错误日志是默认开启的, 其他的都没有开启,需要手动进行开启。


记录显示查询结果比较慢的sql查询语句;         10秒

开启mysql数据库服务的“慢查询日志”  记录超过指定时间显示查询结果的sql语句
1  在数据库服务器上启用慢查询日志  (记录超过指定时间才显示查询结果的sql语句)
                             主机名-slow.log                       10s
                             mysqld-slow.log
                             数据库目录

vim  /etc/my.cnf
[mysqld]
log-slow-queries      启用慢查询日志
long-query-time=5  设置超时时间
slow-query-log-file=fanxhslow
log-queries-not-using-indexes    记录没有使用索引做查询的sql语句
:wq

[root@fanxh ~]#cat   mysqld-slow.log     查看慢查询日志的记录信息
[root@fanxh ~]#[root@localhost mysql]# mysqldumpslow  mysqld-slow.log //查看慢查询日志内容
Reading mysql slow query log from mysqld-slow.log
Count: 2 Time=10.00s (20s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@localhost
select sleep(N)

2.在数据库服务器上启用"查询日志" (记录所有sql语句)
默认日志文件名      mysqld.log   (more  less  tail  cat  head)
                              主机名.log
默认存放目录          数据库目录


vim  /etc/my.cnf    
[mysqld]
log         启用查询日志       
:wq


[root@fanxh ~]#cat  mysqld.log       查看查询日志的记录信息

3.错误日志   默认是开启   ,  记录的数据库服务在启动 和 运行过程中产生的错误信息
默认日志文件名      
                              主机名.err
默认存放目录          数据库目录