设为首页 收藏本站
查看: 498|回复: 0

[经验分享] 数据库服务器mysql性能调优

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-30 08:32:16 | 显示全部楼层 |阅读模式
mysql性能调优分为4个方面
一.硬件(CPU   内存   硬盘)监控CPU  内存 硬盘的值。
[iyunv@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


[iyunv@fanxh ~]#cat   mysqld-slow.log     查看慢查询日志的记录信息
[iyunv@fanxh ~]#[iyunv@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

[iyunv@fanxh ~]#cat  mysqld.log       查看查询日志的记录信息
3.错误日志   默认是开启   ,  记录的数据库服务在启动 和 运行过程中产生的错误信息
默认日志文件名      
                              主机名.err
默认存放目录          数据库目录

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-92043-1-1.html 上篇帖子: MySQL安装文档 下篇帖子: myslq-5.6基于GTID的主从复制实现 服务器 数据库 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表