我正在对一些大型表运行一些查询。我调整了设置,使 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 架构的刷新量。
以下是一张图表
就我而言,
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 无需担心。