mariadb MySQL查询随着时间的推移变得越来越慢

o2gm4chl  于 2023-06-22  发布在  Mysql
关注(0)|答案(1)|浏览(169)

我有一张table,里面有大约900 k的条目。其中大约600 k每5分钟更新一次。(使用REPLACE INTO

CREATE TABLE `servers` (
  `ipport` varchar(255) NOT NULL,
  `ip` varchar(255) NOT NULL,
  `port` int(11) NOT NULL,
  `ip_as_int` int(10) unsigned NOT NULL,
  `version` text NOT NULL,
  `protocol` int(11) NOT NULL,
  `online_count` int(11) NOT NULL,
  `max_count` int(11) NOT NULL,
  `description` text NOT NULL,
  `favicon` text DEFAULT NULL,
  `last_seen` int(11) NOT NULL,
  `cracked` tinyint(1) DEFAULT NULL,
  `joined_on` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`ipport`),
  KEY `ip_as_int_idx` (`ip_as_int`),
  KEY `last_seen_idx` (`last_seen`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci

如果我重新启动MariaDB(systemctl restart mariadb),查询大约需要3秒。时间越长,查询就越慢。(今天早上我看到了一个花了2分钟的!!!)
服务器规格:8 GB RAM 6 vCPU核心8 GB交换内存
变量转储:https://pastebin.com/raw/5aXTxRV1
我想知道为什么查询会随着时间的推移而变慢。
查询总是类似于这样的(但是任何列都可以在WHERE语句中使用):

SELECT /*+ MAX_EXECUTION_TIME(120000) */ * 
FROM servers AS s 
WHERE (protocol = 762) 
AND (s.last_seen > 1687177923) 
ORDER BY RAND() 
LIMIT 100;
ilmyapht

ilmyapht1#

我将从两个查询条件的复合索引开始。

table    index on
servers  ( protocol, last_seen )

删除max_execution_time。
另外,编辑这篇文章,并显示更具体的实际查询和返回的列,以及似乎是查询和c#风格注解的串联。

相关问题