2015-06-29 50 views
0

我正在运行一个自编码的PHP-MySQL网站,并启用具有以下配置的查询缓存。查询缓存和缓冲池无法提供帮助,在磁盘上创建大量表格

query_cache_type = 1 
query_cache_size = 20M 
query_cache_limit = 4096 
query_cache_min_res_unit = 4096 

tmp_table_size = 512M 
max_heap_table_size = 512M 

,因为我能读懂上面的配置:

  • 查询缓存启用
  • 不缓存查询,其结果大小大于4096个字节
  • 总查询,可以是在缓冲区中容纳大约5000个查询结果(20MB/4KB = 5000)

我不明白如何tmp_table_sizemax_heap_table_size将有助于查询缓存。这些变量与在内存或磁盘上创建的临时表相关(如果需要)。

innodb_buffer_pool_size = 4G 
innodb_buffer_pool_instances = 4 

系统有32GB的内存,其中大部分时间里差不多有50%的内存空了。因此,我已将innodb_buffer_pool_size设置为4G。数据库大小约为900MB,每天增长大约2MB。

我得到下面的输出与mysqltuner实用

Key buffer hit rate: 69.3% 
Temporary tables created on disk: 75% 
Query cache efficiency: 5.9% 

看起来我已经设置了一些错误配置。让我知道应该改进什么。

回答

0

温度表(SELECTs)上有多个原因磁盘结束:

  • SELECT列表包括TEXTBLOB列(或大VARCHARVARBINARY
  • 在TMP表比更大任一的tmp_table_sizemax_heap_table_size

“查询缓存”是一个不同的动物。首先要注意的是有用的,只有当

  • 相同SELECT正在执行,
  • 没有写入修改了桌,因为SELECT结果集被缓存,
  • 各种限制(如你所说的)没有超过。

注意Query cache efficiency: 5.9% - 质量控制不是很有用。我会争辩说关闭它。 (如果低于70%,我会关闭它)。

在磁盘上创建tmp表不是世界的尽头。

SHOW GLOBAL STATUS; 

然后Created_tmp_disk_tables/Uptime是资料性的。也许只有10%的服务器值为零。 80%的值小于1 /秒。如何经常你在磁盘上创建tmp表?

大概mysqltuner正在计算这样的:

Created_tmp_disk_tables/(Created_tmp_disk_tables + Created_tmp_tables) 

在这种情况下,我会同意,75%是真的很高。 2%是可取的。

Key buffer hit rate: 69.3%正在谈论MyISAM索引。你在使用MyISAM还是InnoDB?如果您使用的是MyISAM,那么key_buffer_size的值是多少?这可能是无关紧要的 - 为管理目的有少量的MyISAM活动。

回到real问题 - 你想加快缓慢的查询。让我们看看可能会出现在磁盘上的一些查询,以及SHOW CREATE TABLE。这可能是一些简单的修复。

如果您想对设置进行更全面的分析,请提供机器可读版本SHOW VARIABLES;SHOW GLOBAL STATUS;