任何配置错误都会导致 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%
较早的临时表是,of the 23725 temp tables 38% were created on disk
但我从 16m 更改max_heap
为tmp_table
200m,它降低到 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
显示另一个具有默认配置的系统
of 23725 temp tables, 1% were created on disk
但是我尝试在有这个问题的机器上更改为默认值,它仍然显示Of 580 temp tables, 16% were created on disk
我正在使用 Ubuntu 11.4 64 位和 48 GB 内存...任何人都可以提出解决方案吗?
使用“group by”将数据库引擎从 myisam 更改为表上的内存是否可以修复此问题?
根据正在执行的查询,根据需要创建和删除临时表。您看到的数字是自上次 MySQL 启动以来创建的临时表的总数,而不是同时存在的数量。
当查询不能一次性计算时,MySQL 使用临时表。切换存储引擎不会改变这一点。问题出在查询上,而不是配置上。
增加该
tmp_table_size
值只会阻止其中一些写入磁盘,它们仍会在内存中创建并填充数据。这些数据可能首先来自磁盘,尽管使用 48GB 的 RAM 您可能已经缓存了相当多的数据。即使缓存,由于这些临时表中有 30% 大于 200MB,因此在 RAM 中复制该数量的数据仍然需要时间。EXPLAIN
您甚至可以在运行查询之前通过使用语法来确定它是否将使用临时表。只要放在EXPLAIN
你的查询之前,它就会输出一堆关于执行计划和查询效率的信息,而不需要实际执行它。您可能会找到导致这些临时表的查询,因为它们很可能是慢速查询,因此最终会出现在您的慢速查询日志中。
如果您需要帮助调整特定查询,DBA.SE是一个不错的去处。
长话短说
调整您的查询。