所以我有 2 个表,每个表都是 25GB。
表 t1 在单个列上有一个索引,而 t2 有一个复合索引。
我所有的查询都是使用索引的简单查询。
我的 t2 表
CREATE TABLE `t2` (
`uid` bigint(20) DEFAULT NULL,
`time` bigint(20) DEFAULT NULL,
`content` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
KEY `composite` (`uid`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
我的查询
explain select * from t2 where uid between 1 and 10000 and time between 11 and 10000000;
解释结果:
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | q3 | NULL | range | composite | composite | 18 | NULL | 2548 | 11.11 | Using index condition |
+----+-------------+-------+------------+-------+---------------+-----------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.19 sec)
我观察到的奇怪的事情是,当我从快照恢复数据库时,t2 会变得非常慢,延迟时间为 3000,但 t1 会在大约 5 分钟后变得正常(延迟时间为 100)。
我了解快照存储在 s3 中。但是为什么 t1 工作正常但 t2 超级慢?
更新:我手动检查并发现复合索引在那里。我怀疑我的 t2 综合索引甚至不起作用。
而且我认为不是内存缓冲区的问题,否则,经过我 5 分钟的密集查询测试后,t2 应该会恢复正常。