我的 MySQL 存在性能问题。 我有一个相对简单的表格,仅使用数值。
CREATE TABLE `_user_activity` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`jday` mediumint NOT NULL,
`hour` tinyint NOT NULL,
`actions` int NOT NULL,
`seconds` int NOT NULL,
`timestamp` int NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`,`jday`,`hour`)
) ENGINE=InnoDB AUTO_INCREMENT=880420 DEFAULT CHARSET=latin1 ROW_FORMAT=REDUNDANT
该表记录了用户不时的活动。 该表使用唯一索引来识别用户在给定日期的给定时间是否已进行活动。如果没有,请插入执行的操作数量和花费的时间。如果活动已存在,则将值增加传递的值。
INSERT INTO `_user_activity` (user_id, jday, hour, actions, seconds, timestamp)
VALUES (1234567890123, 2460438, 10, 5, 60, 1715085563)
ON DUPLICATE KEY UPDATE actions = actions + 5, seconds = seconds + IF(1715085563 - timestamp > 300, 60, 1715085563 - timestamp), timestamp = 1715085563;
一切正常。但有时,这个查询需要0.3-1.0秒之间的时间,这是非常长的。这种看似随机的行为与在线用户数量无关,甚至在几乎没有用户的情况下也会出现。服务器资源未使用,CPU 和内存使用率在 1-2%,cPanel 图形(资源使用率)接近 0。没有错误,没有故障,日志中没有任何内容。 此外,在其他表(写入或读取)中同时执行的其他 MySQL 查询也会出现合理的执行时间。 当我使用此功能(作为普通用户)时,正常查询执行时间为 0.005 秒。
innodb_buffer_pool_size = 6,442,450,944
max_connections = 250
innodb_thread_concurrency = 0
innodb_thread_sleep_delay = 10,000
innodb_io_capacity = 200
innodb_io_capacity_max = 2,000
innodb_flush_method = fsync
innodb_log_file_size = 50,331,648
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = ON
MySQL 8.0.37
No. maximum concurrent connections 5
Physical Memory 8 GB
Database Disk Usage 2.15 GB
有谁知道这个表的这么长的执行时间从何而来?我重新创建/优化了表格,但仍然没有任何结果。我不知道是否只是这个表时不时地遭受高写入时间的困扰,但它是更新最频繁的表,也是我在如此高的执行时间下最常捕获的表。这可能是一件很普遍的事情,但这一件很突出。顺便说一句,这个表很少用于阅读。
你有多少内存?
扔
id
并将您的 UNIQUE
键提升为 PRIMARY KEY
。这将使某些查询的速度加倍,从而减少冲突的机会。