使用3个条件和1个顺序对大型MySQL表执行长时间查询
数据库:MySQL(InnoDB)版本14.14发行版5.5.60,适用于使用readline 6.3的debian linux gnu(x86_64) forum\u posts表大小:300万行 主查询(3个条件+1个订单):使用3个条件和1个顺序对大型MySQL表执行长时间查询,mysql,Mysql,数据库:MySQL(InnoDB)版本14.14发行版5.5.60,适用于使用readline 6.3的debian linux gnu(x86_64) forum\u posts表大小:300万行 主查询(3个条件+1个订单): SELECT * FROM forum_posts WHERE deleted = 0 AND published = 1 AND show_homepage = 1 ORDER BY id DESC LIMIT 5 OFFSET 25; 5 rows in set
SELECT * FROM forum_posts WHERE deleted = 0 AND published = 1 AND
show_homepage = 1 ORDER BY id DESC LIMIT 5 OFFSET 25;
5 rows in set (12.56 sec)
不按订单查询(3个条件)
在WHERE(已删除+显示主页)中使用ORDER BY和仅2个条件进行查询
在其中(已删除+已发布)使用ORDER BY和仅2个条件进行查询
为什么主查询运行时间约为12秒?
表中所有4个字段都有索引(3个字段来自条件,1个字段来自订单)
此外,我还为3个字段和所有4个字段创建了计算索引。
没什么帮助
请帮助理解问题的原因。可能是因为这是第一个查询,下一个查询只是从缓存中提取数据。您需要对我的朋友进行冷测试。数据库缓存在这里帮助您。更好的是,检查您的解释计划。在后续查询的性能得到回答后,尝试您的查询。对于原始查询;仅仅因为您有索引并不意味着它们对于您的查询是最佳的,或者您的数据库正在生成使用它们的最佳计划。尝试添加多列索引(顺序可能很重要)或使用强制索引测试改进。如前所述,检查执行计划是确定性能损失发生在何处的唯一真正方法。
SELECT * FROM forum_posts WHERE deleted = 0 AND published = 1 AND
show_homepage = 1 LIMIT 5 OFFSET 25;
5 rows in set (0.01 sec)
SELECT * FROM forum_posts WHERE deleted = 0 AND show_homepage = 1 ORDER
BY id DESC LIMIT 5 OFFSET 25;
5 rows in set (0.01 sec)
SELECT * FROM forum_posts WHERE deleted = 0 AND published = 1 ORDER BY
id DESC LIMIT 5 OFFSET 25;
5 rows in set (0.01 sec)