例子

例子

我正在对一些大型表运行一些查询。我调整了设置,使 innodb_buffer_pool_size = 16G,当我查看 show 变量时,我看到为实例分配了 16G。

我正在运行一台 64 位机器,内存为 24G,并安装了 64 位 mysql 服务器。在运行查询时,总共只使用了 6.08GB 的​​物理内存,mysql 只使用了大约 2GB。

资源监视器告诉我,mysqld.exe 进程的提交为 18,699,968,但工作集为 2,069,572。

我需要做什么才能让这台 Windows 服务器在查询期间使用全部 16G 的 RAM?

顺便说一下,我使用 32 位版本的 MySQL Workbench 来运行查询。使用命令行查询也仅使用大约 2GB 内存。

请求查询的结果:

INNODB_BUFFER_POOL_PAGES_DATA   426.80 MB
INNODB_BUFFER_POOL_PAGES_DIRTY  0.00 B 
INNODB_BUFFER_POOL_PAGES_FLUSHED    16.00 KB
INNODB_BUFFER_POOL_PAGES_FREE   15.58 GB
INNODB_BUFFER_POOL_PAGES_MISC   16.00 KB
INNODB_BUFFER_POOL_PAGES_TOTAL  16.00 GB

简单介绍一下背景,我没有为网页或应用程序运行实时服务器。我基本上导入了一个 600k 行表和一个 33k 行表,需要对每个表执行匹配,然后将结果输出到 csvs 中。查询需要很长时间,我希望服务器使用最大数量的 RAM 来加快速度。根据我上面的结果,请告诉我我能做什么。

答案1

您需要从状态变量中了解 InnoDB 缓冲池的细分情况

请运行以下查询

select var,concat(numunit,' ',unit) size from
(
    select var,format(num/power(1024,ex),2) numunit,SUBSTR(units,ex*2+1,2) unit
    from
    (
        select var,num,FLOOR(LOG(IF(num=0,1,num))/LOG(1024)) ex
        from
        (
            select variable_name var,variable_value*pagesize num
            from information_schema.global_status AAA,
            (
                select variable_value pagesize
                from information_schema.global_status
                where variable_name='innodb_page_size'
            ) BBB
            where AAA.variable_name like 'innodb_buffer_pool_pages%'
        ) AA
    ) A,(select 'B KBMBGBTB' units) B
) M;

这将提供缓冲池的当前使用情况以及从中清除的数据量。

例子

mysql> select var,concat(numunit,' ',unit) size from
    -> (
    ->     select var,format(num/power(1024,ex),2) numunit,SUBSTR(units,ex*2+1,2) unit
    ->     from
    ->     (
    ->         select var,num,FLOOR(LOG(IF(num=0,1,num))/LOG(1024)) ex
    ->         from
    ->         (
    ->             select variable_name var,variable_value*pagesize num
    ->             from information_schema.global_status AAA,
    ->             (
    ->                 select variable_value pagesize
    ->                 from information_schema.global_status
    ->                 where variable_name='innodb_page_size'
    ->             ) BBB
    ->             where AAA.variable_name like 'innodb_buffer_pool_pages%'
    ->         ) AA
    ->     ) A,(select 'B KBMBGBTB' units) B
    -> ) M;
+----------------------------------+-----------+
| var                              | size      |
+----------------------------------+-----------+
| INNODB_BUFFER_POOL_PAGES_DATA    | 9.17 GB   |
| INNODB_BUFFER_POOL_PAGES_DIRTY   | 0.00 B    |
| INNODB_BUFFER_POOL_PAGES_FLUSHED | 179.59 GB |
| INNODB_BUFFER_POOL_PAGES_FREE    | 32.00 KB  |
| INNODB_BUFFER_POOL_PAGES_MISC    | 177.05 MB |
| INNODB_BUFFER_POOL_PAGES_TOTAL   | 9.34 GB   |
+----------------------------------+-----------+
6 rows in set (0.00 sec)

mysql>

我有以下内容

  • 9.34G 缓冲池 (9566 MB)
  • 9.17G数据
  • 177.05 MB 用于自适应哈希索引和管理内容
  • 32 KB 可用
  • 无脏页

为啥INNODB_BUFFER_POOL_PAGES_FLUSHED这么高179.59 GB

这就是缓冲池必须提交给 InnoDB 架构的刷新量。

以下是一张图表

InnoDB架构

就我而言,

mysql> SELECT variable_value INTO @Uptime FROM information_schema.global_status WHERE variable_name='Uptime'; SELECT NOW() "Right Now",MySQLStartupTime "MySQL Started",TimeDisplay "MySQL Has Been Running For" FROM (SELECT NOW() - INTERVAL @Uptime SECOND MySQLStartupTime) M,(SELECT TRIM(REPLACE(CONCAT(IF(dy=0,'',IF(dy=1,'1 day ',CONCAT(dy,' days '))),IF(hr=0,'',IF(hr=1,'1 hour ', CONCAT(hr,' hours  '))),IF(mn=0,'',IF(mn=1,'1 minute ',CONCAT(mn,' minutes '))),IF(sc=0,'',IF(sc=1,'1 second ',CONCAT(sc,' seconds ')))),'  ',' ')) TimeDisplay FROM (SELECT dy,hr,mn,MOD(sec_aaaa,60) sc FROM (SELECT dy,hr,FLOOR((sec_aaa - dy*86400 - hr*3600)/60) mn,sec_aaa sec_aaaa FROM (SELECT dy,FLOOR((sec_aa - (dy*86400))/3600) hr,sec_aa sec_aaa FROM (SELECT FLOOR(sec_a/86400) dy,sec_a sec_aa FROM (SELECT @Uptime sec_a) A) AA) AAA) AAAA) B) N;
Query OK, 1 row affected (0.02 sec)

+---------------------+---------------------+-------------------------------+
| Right Now           | MySQL Started       | MySQL Has Been Running For    |
+---------------------+---------------------+-------------------------------+
| 2014-08-08 17:13:42 | 2014-06-26 16:38:56 | 43 days 34 minutes 46 seconds |
+---------------------+---------------------+-------------------------------+
1 row in set (0.00 sec)

MySQL 已运行 43 天。它已从缓冲池中清除了 179GB 的数据。

缓冲池必须将脏页刷新到三个地方

  • 日志缓冲区
  • 插入缓冲区
  • 表格的 .ibd 文件

我有一个相当繁忙的服务器,它是一个虚拟机。

就您而言,从 2,069,572 K 缓冲池中刷新 18,699,968 K 无需担心。

相关内容