zoukankan      html  css  js  c++  java
  • 数据库Mysql性能优化

    关于本文,笔者参考了一下其他博主的资料,加上个人的认知和理解,先整理如下:

    在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysql Key_buffer_size参数的设置进行详细介绍下面为一台以MyISAM为主要存储引擎服务器的配置:

    1 mysql> show variables like 'key_buffer_size';
    2 +-----------------+------------+
    3 | Variable_name | Value |
    4 +-----------------+------------+
    5 | key_buffer_size | 536870912 |
    6 +-----------------+------------+

    分配了512MB内存给mysql key_buffer_size,我们再看一下key_buffer_size的使用情况:

    1 mysql> show global status like 'key_read%';
    2 +------------------------+-------------+
    3 | Variable_name | Value |
    4 +------------------------+-------------+
    5 | Key_read_requests | 27813678764 |    //从缓存读取索引的请求次数。
    6 | Key_reads | 6798830 |         //从磁盘读取索引的请求次数。
    7 +------------------------+-------------+

    一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:

    key_cache_miss_rate = Key_reads / Key_read_requests * 100%

    比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),所以理论来上来说,这个比值越小越好,但过小的话,难免造成内存浪费。

    以上两个值的比率固然能一部分的说明key_buffer_size是否合理,但仅仅以此就说明该值设置的合理的话,就过于偏激和片面了。因为这里忽略了两个问题:

    1、比例并不显示数量的绝对值大小

    2、计数器并没有考虑时间因素

    虽说Key_read_requests大比小好,但是对于系统调优而言,更有意义的应该是单位时间内的Key_reads,即:

    Key_reads / Uptime

    具体查看方法如下:

     1 [root@web20 mysql]# mysqladmin ext -uroot -p -ri10 | grep Key_reads
     2 Enter password:
     3 | Key_reads                      | 279225     |
     4 | Key_reads                      | 116        |
     5 | Key_reads                      | 294        |
     6 | Key_reads                      | 255        |
     7 | Key_reads                      | 259        |
     8 | Key_reads                      | 342        |
     9 | Key_reads                      | 541        |
    10 | Key_reads                      | 733        |
    11 | Key_reads                      | 387        |
    12 | Key_reads                      | 583        |

     

    注:命令里的mysqladmin ext其实就是mysqladmin extended-status,你甚至可以简写成mysqladmin e。

    其中第一行表示的是汇总数值,所以这里不必考虑,下面的每行数值都表示10秒内的数据变化,从这份数据可以看出每10秒系统大约会出现500次Key_reads访问,折合到每1秒就是50次左右,至于这个数值到底合理与否,就由服务器的磁盘能力而定了。(注:我这里之所以数据变化较大,是因为有update等语句造成了表锁而导致下个时间段内的查询数猛增。)

    为啥数据按10秒取样,而不是直接按1秒取样?由于时间段过小,数据变化比较剧烈,不容易直观估计大小,所以通常数据按照10秒或者60秒之类的时间段来取样是更好的。

    以上部分主要参考了mysql performance blog的一篇博客

    除些之外,我们还可以参考下key_blocks_*参数:

    1 mysql> show global status like 'key_blocks_u%';
    2 +------------------------+-------------+
    3 | Variable_name | Value |
    4 +------------------------+-------------+
    5 | Key_blocks_unused | 0 |
    6 | Key_blocks_used | 413543 |
    7 +------------------------+-------------+

     

    Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:

    Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
    

      

    笔者注:

    查看簇(文件系统块,block)的大小(字节数)

    Centos中有以下几种方法:

    #tune2fs /dev/sda1 | grep "block size"
    
    #dumpe2fs /dev/sda1 | grep "block size"

    理论上文件系统块是扇区的倍数

    mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态、进程信息、进程杀死等。本文介绍一下如何使用mysqladmin extended-status(因为没有"歧义",所以可以使用ext代替)了解MySQL的运行状态。

    1. 使用-r/-i参数

    使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果想了解当前的状态,则需要进行一次差值计算,这就是mysqladmin extended-status的一个额外功能,非常实用。默认的,使用extended-status,看到也是累计值,但是,加上参数-r(--relative),就可以看到各个指标的差值,配合参数-i(--sleep)就可以指定刷新的频率,那么就有如下命令:

     1 mysqladmin -uroot -r -i 1 -pxxx extended-status
     2 +------------------------------------------+----------------------+
     3 | Variable_name                            | Value                |
     4 +------------------------------------------+----------------------+
     5 | Aborted_clients                          | 0                    |
     6 | Com_select                               | 336                  |
     7 | Com_insert                               | 243                  |
     8 ......
     9 | Threads_created                          | 0                    |
    10 +------------------------------------------+----------------------+

    2. 配合grep使用

    配合grep使用,我们就有:

     1 mysqladmin -uroot -r -i 1 -pxxx extended-status 
     2 grep "Questions|Queries|Innodb_rows|Com_select |Com_insert |Com_update |Com_delete "
     3 | Com_delete                               | 1                    |
     4 | Com_delete_multi                         | 0                    |
     5 | Com_insert                               | 321                  |
     6 | Com_select                               | 286                  |
     7 | Com_update                               | 63                   |
     8 | Innodb_rows_deleted                      | 1                    |
     9 | Innodb_rows_inserted                     | 207                  |
    10 | Innodb_rows_read                         | 5211                 |
    11 | Innodb_rows_updated                      | 65                   |
    12 | Queries                                  | 2721                 |
    13 | Questions                                | 2721                 |

    当然,还可以配合awk等,笔者在这里就不一一介绍了,有情趣的朋友可以参考一下其它文档。

  • 相关阅读:
    2021 0309-1 准备工作
    课程总结
    第十四周课程总结&实验报告
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周课程总结
    2019春总结作业
    第十二周作业
    第十一周作业
  • 原文地址:https://www.cnblogs.com/itxiongwei/p/5533995.html
Copyright © 2011-2022 走看看