我运行并得到了关于和pt-variable-advisor
的不同设置的注释。max_heap_table_size
tmp_table_size
通过网络搜索,我只找到了旧文章(2007 年左右)。
pt-variable-advisor h=localhost,u=root,p=Quule0juqu7aifohvo2Ahratit --socket /var/vcap/sys/run/mysql/mysqld.sock
(...)
# NOTE tmp_table_size: The effective minimum size of in-memory implicit temporary tables used internally during query execution is min(tmp_table_size, max_heap_table_size), so max_heap_table_size should be at least as large as tmp_table_size.
(...)
我们的配置
max_heap_table_size = 16777216
tmp_table_size = 33554432
我们没有修改cf-mysql-release的默认值。我看到 MariaDB KB 推荐了其他默认值。
cf_mysql.mysql.tmp_table_size:
description: 'The maximum size (in bytes) of internal in-memory temporary tables'
default: 33554432
cf_mysql.mysql.max_heap_table_size:
description: 'The maximum size (in rows) to which user-created MEMORY tables are permitted to grow'
default: 16777216
我还找到了优化 MySQL tmp_table_size并检查了我们的值和配置:
MariaDB [(none)]> show global status like 'created_tmp_disk_tables';
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| Created_tmp_disk_tables | 12727901 |
+-------------------------+----------+
1 row in set (0.01 sec)
MariaDB [(none)]> show global status like 'created_tmp_tables';
+--------------------+-----------+
| Variable_name | Value |
+--------------------+-----------+
| Created_tmp_tables | 115714303 |
+--------------------+-----------+
1 row in set (0.01 sec)
MariaDB [(none)]> select (12727901*100)/(115714303 + 12727901) as "Created disk tmp tables ratio" from dual;
+-------------------------------+
| Created disk tmp tables ratio |
+-------------------------------+
| 9.9094 |
+-------------------------------+
1 row in set (0.00 sec)
我们的(默认)配置有问题吗?我们不知道我们的工作量。我们为具有不同使用模式的小型 Web 应用程序运行了大约 500 个小型数据库。
简短的回答:这些都不是“错误的”。
这些设置是如何使用的?
这两个设置有(如果我没记错的话)恰好有 2 种用途。正如您引用的一些内容所暗示的那样,它们是:
当你这样做时
CREATE TABLE ... ENGINE=MEMORY
,它会给出一个当前值的限制max_heap_table_size
。您可以并且“应该”在执行此操作之前更改该设置CREATE
。太大的值可能会浪费宝贵的 RAM。当复杂
SELECT
需要创建临时表时,例如在准备中ORDER BY
,它首先尝试使用一个MEMORY
表;如果失败(由于多种原因中的任何一种),它会使用MyISAM
.MEMORY
表大小的限制是min(max_heap_table_size, tmp_table_size)
。我不相信
tmp_table_size
是每一个都单独使用。如果您从不明确创建
MEMORY
表,那么将这两个设置设为相同可以避免混淆和此类讨论。因此,使它们平等的警告比您引用的措辞要弱。它是“有点,有点,应该”,而不是“你必须!”。
不同的观点: 让我从另一个角度来处理你的问题。
Intra-select tmp 表可能经常出现——在每个连接中,甚至在单个选择中多次出现。因此,保持
tmp_table_size
“低”对于避免耗尽 RAM 很重要。我建议不超过 1% 的 RAM,但这是相当随意的。同时,如果您正在使用 MEMORY 表,则需要控制它们的大小。
好吧,我已经走到了死胡同。为什么他们有“min(...)”?为什么不把它们分开呢?
我不知道。
未来: 以上讨论至少适用于 MySQL 4.0 到 5.7 版本,以及 MariaDB 的所有版本(到目前为止)。MySQL 8.0 使用“临时表引擎”,这可能导致上述某些讨论没有实际意义。