我们有一个 MySQL DB (v 5.5),它为一个大型网站提供动力。该网站的一部分包含一个拥有超过 2,000,000 个帖子的论坛。
该站点最近的流量大幅增加(约 700 -> 1,000 个同时连接),这导致站点上的一些查询非常缓慢。分析慢查询日志后,我们看到很多这样的查询:
-- Time: 120923 20:00:08
-- User@Host: muselive_ldu[muselive_ldu] @ localhost []
-- Query_time: 61.101385 Lock_time: 0.000050 Rows_sent: 2 Rows_examined: 346970
SET timestamp=1348430408;
SELECT fp_id FROM ldu_forum_posts WHERE fp_topicid='13731' ORDER BY fp_id ASC LIMIT 2;
-- Time: 120923 20:01:09
-- User@Host: muselive_ldu[muselive_ldu] @ localhost []
-- Query_time: 376.077866 Lock_time: 72.060203 Rows_sent: 2 Rows_examined: 2214232
SET timestamp=1348430469;
SELECT fp_id FROM ldu_forum_posts WHERE fp_topicid='52526' ORDER BY fp_id ASC LIMIT 2;
我不是 MySQL 专家,但是 Rows_examined 部分让我很头疼。我们正在查找一个有大约 2,000,000 行的表,但是我们通过“fp_id”进行查询,它应用了一个 btree 索引。尽管存在此索引,但 Rows_examined 计数从 ~300,000 波动到全表扫描。我还应该提到我们在 fp_topicsid 上也有一个索引。
有谁知道我们为什么会看到这个?真的很感激这方面的一些帮助:)
谢谢!