【问题标题】:Optimal MySQL temporary tables (memory tables) configuration?最佳 MySQL 临时表(内存表)配置?
【发布时间】:2011-03-14 00:15:39
【问题描述】:

首先,我是优化 mysql 的新手。事实是,我的 Web 应用程序中有一个使用 GROUP BY 的查询(每秒大约 400 个查询),这是我无法避免的,这就是创建临时表的原因。我的配置是:

max_heap_table_size = 16M  
tmp_table_size = 32M  

结果:临时表到磁盘的百分比 + - 12.5%

然后我根据this post更改了我的设置

max_heap_table_size = 128M  
tmp_table_size = 128M

结果:临时表到磁盘的百分比 + - 18%

结果出乎意料,不明白为什么。

tmp_table_size = max_heap_table_size? 不应该增加尺寸吗?

查询

SELECT images, id  
FROM classifieds_ads   
WHERE  parent_category = '1' AND published='1' AND outdated='0'
GROUP BY aux_order  
ORDER BY date_lastmodified DESC  
LIMIT 0, 100;

解释

| 1 |SIMPLE|classifieds_ads | ref |parent_category, published, combined_parent_oudated_published, oudated | combined_parent_oudated_published | 7 | const,const,const | 67552 | Using where; Using temporary; Using filesort |

【问题讨论】:

  • 不用道歉——你的英语很好。
  • 同意 OMG 小马;我们希望不会阻止任何人提问,以防他们的英语不够出色。
  • 您的书面英语比我不幸共事的一些以英语为母语的同事要好! :)
  • 谢谢,我承认我从谷歌翻译那里得到了一点帮助。
  • 用介词来结束句子是一件坏事......

标签: sql mysql performance optimization temp-tables


【解决方案1】:

EXPLAIN 报告中的“使用临时”并没有告诉我们临时表在磁盘上。它只告诉我们查询期望创建一个临时表。

如果临时表的大小小于 tmp_table_size 并且小于 max_heap_table_size,则临时表将保留在内存中。

Max_heap_table_size 是 MEMORY 存储引擎中的最大表,无论该表是临时表还是非临时表。

Tmp_table_size 是由查询自动创建的表在内存中的最大容量。但这无论如何都不能大于 max_heap_table_size 。因此将 tmp_table_size 设置为大于 max_heap_table_size 没有任何好处。通常将这两个配置变量设置为相同的值。

您可以像这样监控创建了多少临时表,以及磁盘上有多少:

mysql> show global status like 'Created%'; 
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 20    |
| Created_tmp_files       | 6     |
| Created_tmp_tables      | 43    |
+-------------------------+-------+

请注意,在此示例中,创建了 43 个临时表,但其中只有 20 个在磁盘上。

当您增加 tmp_table_size 和 max_heap_table_size 的限制时,您允许更大的临时表存在于内存中。

你可能会问,你需要做多大?您不一定需要使其足够大以使每个临时表都适合内存。您可能希望 95% 的临时表适合内存,而只有剩余的稀有表在磁盘上。最后的 5% 可能非常大 - 比您要使用的内存量大得多。

所以我的做法是保守地增加 tmp_table_size 和 max_heap_table_size。然后观察 Created_tmp_disk_tables 与 Created_tmp_tables 的比率,看看我是否达到了让 95% 留在内存中的目标(或者我想看到的任何比率)。

不幸的是,MySQL 没有一个好的方法可以准确地告诉您临时表有多大。每个查询都会有所不同,因此状态变量无法显示,它们只能向您显示发生次数的计数。并且 EXPLAIN 实际上并不执行查询,因此它无法准确预测它将匹配多少数据。

另一种选择是Percona Server,它是经过改进的 MySQL 发行版。其中之一是log extra information in the slow-query log。额外字段中包含由给定查询创建的任何临时表的大小。

【讨论】:

    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 2021-05-16
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多