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