我有一张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;
1条答案
按热度按时间ilmyapht1#
我将从两个查询条件的复合索引开始。
删除max_execution_time。
另外,编辑这篇文章,并显示更具体的实际查询和返回的列,以及似乎是查询和c#风格注解的串联。