我在一些大的表上运行一些查询。 我调整了我的设置,以便innodb_buffer_pool_size = 16G,当我看显示variables,我看到16G分配给实例。
我正在运行一个24位内存的64位机器,并安装了mysql服务器64位。 当我的查询正在运行时,总共只有6.08GB的物理内存,而对于mysql来说只有大约2GB。
资源监视器告诉我,mysqld.exe进程提交了18,699,968,但工作集2,069,572。
我需要做些什么来使这个Windows服务器在查询过程中使用完整的16G RAM?
我正在使用32位版本的MySQL工作台来运行我的查询顺便说一句。 使用命令行查询也只能使用大约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。 查询是永久的,我希望服务器使用最大数量的内存来快速的事情。 根据我上面的结果,让我知道我能做些什么。
您需要了解来自状态variables的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;
这将给出缓冲池当前使用情况的状态以及从中清除了多less数据。
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>
我有以下
为什么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。
缓冲池必须将脏页面刷新到三个位置
我有一个相当繁忙的服务器,这是一个虚拟机。
在你的情况下,2,069,572 K缓冲池中的18,699,968 K次冲洗是不用担心的。