Eu corro pt-variable-advisor
e tenho uma nota sobre diferentes configurações para max_heap_table_size
e tmp_table_size
.
Com uma pesquisa na web encontrei apenas artigos antigos (por volta de 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.
(...)
Nossa configuração
max_heap_table_size = 16777216
tmp_table_size = 33554432
Nós não modificamos os padrões de cf-mysql-release . Vi que o MariaDB KB recomenda outros valores padrão.
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
Encontrei também Optimize MySQL tmp_table_size e verifiquei nossos valores e a configuração:
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)
Há algo errado com nossa configuração (padrão)? Não sabemos nossa carga de trabalho. Executamos cerca de 500 pequenos bancos de dados para pequenos aplicativos da web com diferentes padrões de uso.
Resposta curta: Nenhuma delas é "errada".
Como essas configurações são usadas?
Existem (se não me engano) exatamente 2 usos para essas duas configurações. Eles são, como aludido em alguns dos que você citou:
Quando você faz
CREATE TABLE ... ENGINE=MEMORY
isso, é dado um limite do valor atual demax_heap_table_size
. Você pode, e "deve", alterar essa configuração antes de fazer issoCREATE
. Um valor muito grande pode desperdiçar RAM preciosa.Quando o complexo
SELECT
precisa criar uma tabela temporária, como em preparação paraORDER BY
, ele primeiro tenta usar umaMEMORY
tabela; se isso falhar (por qualquer um dos vários motivos), ele recorre ao uso deMyISAM
. O limite doMEMORY
tamanho da tabela émin(max_heap_table_size, tmp_table_size)
.Eu não acredito
tmp_table_size
é cada usado por si só.Se você nunca criar explicitamente uma
MEMORY
tabela, ter essas duas configurações iguais evita confusão e discussões como essa.Assim, a advertência para torná-los iguais é mais fraca do que o texto que você cita. É "sorta, kinda, shoulda", e não "você DEVE!".
Uma perspectiva diferente: deixe-me abordar sua pergunta de outro ponto de vista.
As tabelas tmp intra-selecionadas podem acontecer com frequência -- em todas as conexões e até várias vezes em uma única seleção. Portanto, manter
tmp_table_size
"baixo" é importante para evitar estourar a RAM. Eu recomendo não mais que 1% de RAM, mas isso é bastante arbitrário.Se, entretanto, estiver a brincar com as mesas MEMORY, precisa de controlar os seus tamanhos.
OK, cheguei a um beco sem saída. Por que eles têm o "min(...)"? Por que não deixá-los separados?
Não sei.
Futuro: A discussão acima se aplica a pelo menos as versões 4.0 a 5.7 do MySQL, além de todas as versões (até agora) do MariaDB. O MySQL 8.0 usa um "mecanismo de tabela temporária", o que pode fazer com que algumas das discussões acima sejam discutíveis.