mysql - 使用 3 个条件和 1 个顺序对大型 MySQL 表执行长查询
问题描述
数据库: MySQL (InnoDB) 版本 14.14 Distrib 5.5.60,用于 debian-linux-gnu (x86_64),使用 readline 6.3
forum_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 (12.56 sec)
不带 ORDER BY 的查询(3 个条件)
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)
使用 ORDER BY 查询,WHERE 中只有 2 个条件(已删除 + show_homepage)
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)
使用 ORDER BY 查询,WHERE 中只有 2 个条件(已删除 + 已发布)
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)
为什么主查询运行时间约为 12 秒?表具有所有 4 个字段的索引(3 个来自条件的字段和 1 个来自订单的字段)。
我还为 3 个字段和所有 4 个字段创建了计算索引。没有什么帮助。
请帮助了解问题的原因。
解决方案
推荐阅读
- google-apps-script - 我拥有的项目未显示在“我的项目”中
- javascript - 状态数组上的多个不可变更改
- javascript - Mongodb查询哪些商店在给定时间开放
- python-3.x - 气流心跳警告日志导致 ssh 连接断开
- git - 如何从用户机器导入或添加 bitbucket rsa 密钥以便 git clone 工作?
- r - 向线性模型添加多项式项
- android - MVVM 模式中的 LiveData 与改造 kotlin
- javascript - 如何解决错误(发送到客户端后无法设置标头)
- timeout - Bonita BPM 停止工作或没有响应和磁盘队列长度
- javascript - 如果我们通常需要在继续之前处理一个承诺,为什么不返回一个已经处理的响应而不是一个承诺的响应呢?