查询缓存和缓冲池无法提供帮助,在磁盘上创建了很多表

时间:2015-06-29 07:39:02

标签: mysql performance caching query-cache

我正在运行一个自编码的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_size max_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%

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

1 个答案:

答案 0 :(得分:0)

临时表(对于SELECTs)最终出现在磁盘上有多种原因:

  • SELECT列表包含TEXTBLOB列(或大VARCHARVARBINARY
  • tmp表格大于tmp_table_sizemax_heap_table_size

"查询缓存"是一种不同的动物。首先请注意,它仅在

时才有用
  • 正在执行相同的 SELECT
  • 没有写入修改了表格,因为SELECT结果集已缓存,
  • 未超出各种限制(如您所提及的那样)。

注意Query cache efficiency: 5.9% - QC对您没有多大用处。我会争辩要把它关掉。 (如果低于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活动。

返回真正的问题 - 您希望加快查询速度。让我们看一些可能溢出到磁盘的查询以及SHOW CREATE TABLE。这可能是一些简单的解决方法。

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