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%

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

4

1 回答 1

0

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

  • SELECT列表包括TEXTorBLOB列(或大VARCHARor VARBINARY
  • 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;

于 2015-06-29T17:25:36.843 回答