MySQL - 简单查询有时真的很慢

MySQL - 简单查询有时真的很慢

我的 MySQL 服务器出现了一些问题

# Time: 2017-10-30T09:25:41.253828Z
# User@Host: dbXXXXXXXXXXXX[dbXXXXXXXXXXXX] @ localhost []  Id:   469
# Query_time: 26.990475  Lock_time: 0.000039 Rows_sent: 0  Rows_examined: 1
use dbXXXXXXXXXXXX;
SET timestamp=1509355541;
UPDATE online SET last_ping=1509355514 WHERE `device`='wggggn4gggk2gggggXYgEokgggggpOggf';

该表非常简单,包含大约 1000 行 https://cdn.pbrd.co/images/GRjN6fE.png

我不知道为什么有时要花这么长时间。上次ping设备在线时每5秒更新一次。

或者来自 WordPress 的这个:

# Time: 2017-10-30T07:55:24.755752Z
# User@Host: sobotiste[sobotiste] @ localhost []  Id: 22317
# Query_time: 9.586909  Lock_time: 0.000113 Rows_sent: 0  Rows_examined: 1
use sobotiste;
SET timestamp=1509350124;
UPDATE `wp_options` SET `option_value` = '1509351915' WHERE `option_name` = '_transient_timeout_4__974818834';

我应该怎么办?

服务器版本(来自 PMA):

Server: Localhost via UNIX socket
Server type: MySQL
Server version: 5.7.20-0ubuntu0.16.04.1-log - (Ubuntu)
Protocol version: 10
User: root@localhost
Server charset: UTF-8 Unicode (utf8)

我的.cnf:

[mysqld]
query_cache_type=1
long_query_time=8
slow_query_log=ON
query_cache_limit=32M
innodb_buffer_pool_size=3G
innodb_log_file_size=256M
innodb_log_buffer_size=4M
join_buffer_size=512K
max_heap_table_size=64M
tmp_table_size=64M
table_open_cache=1024
innodb_lru_scan_depth=256
key_buffer_size=32M

答案1

当您遇到性能问题时,您必须纵观全局才能了解可以优化的地方。专注于单一症状会隐藏您遗漏的其他重要细节。

通常在 Wordpress 上,每个 SQL 查询都在单个事务中运行。这意味着 UPDATE/DELETE/INSERT/ALTER 查询只有在数据写入磁盘后才会返回完成状态。

该查询可能会受到锁定行或表的其他查询的影响,但由于 Lock_time 较低,因此对您来说情况并非如此。

这意味着这个简单的查询本身就是问题所在。此查询依赖于磁盘系统的速度。您的 MySQL 磁盘速度将受到使用它的其他客户端的影响,例如:

  • 使用同一磁盘阵列的其他虚拟机
  • 同一台机器上或使用相同磁盘阵列的不同机器上的其他进程
  • 磁盘阵列的背景检查和恢复
  • 阵列或虚拟机管理程序级别的存储迁移

您可以在机器内部做什么?首先确定您是否在虚拟机内运行。如果是虚拟机,则与其他租户共享的可能性非常高。

检查磁盘上的延迟。对于 Linux,运行iostat -x 1并查看await列。应尽可能低。对于 Windows,请检查https://blogs.technet.microsoft.com/askcore/2012/02/07/measuring-disk-latency-with-windows-performance-monitor-perfmon/

超过 200ms 的延迟很高。

请记住,性能取决于您的感知。2000 年时,快速应用程序的性能在今天看来可能很慢。

相关内容