为什么 MySQL 使用这么多临时表?

ana*_*han 5 mysql innodb myisam memory

任何配置错误是否会导致 mysql..mysql 调谐器显示创建过多的临时表

Current max_heap_table_size = 200 M
Current tmp_table_size = 200 M
Of 17158 temp tables, 30% were created on disk


table_open_cache = 125 tables
table_definition_cache = 256 tables

You have a total of 97 tables

You have 125 open tables.

Current table_cache hit rate is 3%
Run Code Online (Sandbox Code Playgroud)

早些时候,临时表是of the 23725 temp tables 38% were created on disk,但我改变max_heap,并tmp_table从16米200米和它降低到30%..

engine myisam 
group_concat_max_len = 32768
key_buffer_size = 3.7 GB,
thread_stack = 256k,
table_cache = 125
query_cache_limit = 1M
query_cache_size = 16M
join_buffer_size = 2.00 M

max_connections = 800
Run Code Online (Sandbox Code Playgroud)

另一个具有默认配置的系统正在显示 of 23725 temp tables, 1% were created on disk

但是我尝试在出现此问题的机器上更改为默认值,它仍然显示 Of 580 temp tables, 16% were created on disk

我正在使用带有 48 gb ram 的 Ubuntu 11.4 64 位...任何人都可以提出解决方案吗?

使用“group by”将数据库引擎从 myisam 更改为表上的内存会解决这个问题吗?

Joh*_*ers 6

根据正在执行的查询,根据需要创建和删除临时表。您看到的数字是自上次启动 MySQL 以来创建的临时表的总和,而不是同时存在的数量。


Lad*_*ada 5

当查询无法一次性计算时,MySQL 使用临时表。切换存储引擎不会改变这一点。问题在于查询,而不是配置。

增加该tmp_table_size值只会阻止其中一些写入磁盘,它们仍将在内存中创建并填充数据。这些数据可能首先来自磁盘,尽管使用 48GB 的​​ RAM,您可能已经缓存了很多数据。即使缓存,由于这些临时表中有 30% 大于 200MB,因此在 RAM 中复制该数量的数据仍然需要时间。

您甚至可以在运行查询之前通过使用EXPLAIN语法确定它是否将使用临时表。只要放在EXPLAIN你的查询之前,它就会输出一堆关于执行计划和查询效率的信息,而无需实际执行它。

您可能会找到导致这些临时表的查询,因为它们很可能是慢查询,因此最终会出现在您的慢查询日志中。

如果您需要帮助调整特定查询,DBA.SE是一个不错的选择。

TL; 博士

调整您的查询。