我正在运行一个自编码的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
我能够将以上配置读作:
我不明白 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%
看起来我设置了一些错误的配置。让我知道应该改进什么。
答案 0 :(得分:0)
临时表(对于SELECTs
)最终出现在磁盘上有多种原因:
SELECT
列表包含TEXT
或BLOB
列(或大VARCHAR
或VARBINARY
)tmp_table_size
或max_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;
的机器可读版本。