这段时间,由于要提取一些关键词,所以要遍历 mysql 中整个表一条条的操作,于是毫不犹豫的写出了下面的语句:
1
SELECT * FROM documents ORDER BY id LIMIT ?, 1
这语句已经是简单的令人发指了,所以也没想太多,直接就跑了起来。
然而,跑着跑着,某次回来看的时候,发现执行很慢,经常更新一个就要卡好久, 刚开始以为是网络不太好,没太在意,后来感觉实在是有点不对劲,就加日志仔细查了下是哪里慢了,结果竟然发现那句 SELECT 异常的慢。 抱着不敢相信的态度,去命令行下执行了一下,发现真的用了快一分钟才执行一句,当时就惊呆了。 我们这可是主键聚簇索引,并且还只取一条数据而已啊!!!
于是仔细又测试了一下,发现在 offset 小的时候没什么问题,之后 offset 大了之后才会有问题, 看查询分析也会发现,里面显示的行数也跟 offset 有关,看来真的就是 offset 不会快速跳过,还是会一个个的扫过来,想想真是恐怖。 虽然不知道为什么会设计成这样,讲道理 B tree 索引应该有能力直接找到第 N 大的元素啊。