【问题标题】:MySQL is getting slowerMySQL越来越慢
【发布时间】:2016-03-05 18:03:11
【问题描述】:

php 应用程序MySQL 中有时会变慢。当我重新启动mysql服务时,它就可以正常工作了。

以下是我在my.cnf 文件中所做的一些关键配置:

skip-external-locking
skip-name-resolve

我还启用并检查了slow query logs。那里什么都没有,因为它是间歇性问题。

所有用户都与服务器 IP 地址相关联。

MySQL Tunner 建议:

-------- 性能指标 ------------------------- -----

[--] Up for: 19h 23m 22s (5K q [0.072 qps], 1K conn, TX: 2M, RX: 606K)

[--] 读取/写入:99% / 1%

[--] 二进制日志被禁用

[--] 总缓冲区:1.1G 全局 + 2.7M 每个线程(最大 5000 个线程)

[OK] 达到的最大内存使用量:1.1G(已安装 RAM 的 32.15%)

[!!] 最大可能的内存使用量:14.2G(已安装 RAM 的 422.17%)

[OK] 慢查询:0% (0/5K)

[OK] 可用连接的最高使用率:0% (4/5000)

[!!] 中止的连接:4.72% (89/1886)

[!!] 查询缓存被禁用

[OK] 需要临时表的排序:0%(0 个临时排序/92 个排序)

[!!] 在磁盘上创建的临时表:70%(磁盘上 608 / 总共 868)

[OK] 线程缓存命中率:99%(4 个创建/1K 连接)

[OK] 表缓存命中率:95%(166打开/173打开)

[OK] 使用的打开文件限制:0% (76/25K)

[OK] 立即获取表锁:100%(2K 立即/2K 锁)

如果您需要更多信息来解决此问题,请告诉我。

【问题讨论】:

  • 您是如何衡量性能下降的? top“慢”时会说什么?也许您的慢查询阈值对于真正发生的事情来说太高了
  • 您使用哪个数据库引擎?
  • @EhsanKhodarahmi:innoDB

标签: php mysql performance database-performance


【解决方案1】:

先检查Mysql Log

也许您处于 75% 的系统等待状态,很可能是由于大量交换。

  1. 使用 mysqltuner.pl 找出影响内存的变量 用法
  2. 在顶部按“m”查看是什么吞噬了内存
  3. 使用 free -m 查看缓存了多少
  4. 使用 iotop 查看谁在吃 IO

当您不知道发生了什么时,EXPLAIN 扩展命令会显示有关您的查询的详细信息http://dev.mysql.com/doc/refman/5.0/en/explain-extended.html

利用查询缓存http://dev.mysql.com/doc/refman/5.1/en/query-cache-configuration.html

确保你的 MySQL 服务器配置文件选项根据你的硬件优化http://dev.mysql.com/doc/refman/5.5/en/option-files.html

确保在创建表结构时使用优化的数据类型 例如,“评论”字段的大小为 256 个字符,使用 VARCHAR(256) 类型的字段而不是 TEXT 将其回复到 MYSQL。查询会快很多。

【讨论】:

    【解决方案2】:

    这个:

    [--] Total buffers: 1.1G global + 2.7M per thread (5000 max threads)
    

    与此有关:

    [!!] Maximum possible memory usage: 14.2G (422.17% of installed RAM)
    

    这很糟糕,因为一旦您开始使用的 RAM 超过系统中可用的 RAM,您就会开始交换到磁盘并且性能会下降,急剧

    这没有什么好的理由,永远:

    [!!] Query cache is disabled
    

    检查内存使用情况可能有助于解决此问题:

    [!!] Temporary tables created on disk: 70% (608 on disk / 868 total)
    

    【讨论】:

    • 感谢您指出这些事情。你能详细说明我该如何解决这个问题吗?
    【解决方案3】:

    在使用 INNODB 时,整体 DBMS 性能取决于很多配置(在 my.ini 中),并且调整它们是一项实验性工作,取决于从物理能力到表索引到连接甚至排序查询的广泛因素。 一般来说,我猜最重要的INNODB配置属性是innodb_buffer_pool_size

    与 MyISAM 不同,InnoDB 使用缓冲池来缓存索引和行数据。您设置的越大,访问表中的数据所需的磁盘 I/O 就越少。在专用数据库服务器上,您可以将此参数设置为机器物理内存大小的 80%。但是不要设置太大,因为物理内存的竞争可能会导致操作系统分页。

    如果你的数据库最近变大了,而innodb_buffer_pool_size 很小,那将是第一个怀疑点。当然,更改此属性(通常使用一些其他参数,例如 innodb_log_file_size)很痛苦,因为您必须转储和恢复所有数据。
    如果还是不行,那就再考虑其他的可能,这不是一件简单的事情。

    【讨论】:

    • 我的服务器上有14G 内存。而且我没有专用的数据库服务器。 PHP 也在同一台服务器下运行。在我当前的配置中,innodb_buffer_pool_size1G。可以吗?
    • 我不能说它是否可以,因为它取决于您的数据库(索引数据)的大小。如果您的数据库大小不大(与innodb_buffer_pool_size 相比),那么您应该考虑其他可能性,例如tmp_table_sizequery_cache_size
    【解决方案4】:

    max_connections = 100 -- 不是 5000
    long_query_time = 1 -- 让慢日志更有用
    保持慢日志开启
    关闭查询缓存
    (磁盘上 608 个 / 总共 868 个)--> 请查看慢日志
    使用 pt-query-digest 查找“最差”的查询。

    【讨论】: