mysql - Laravel 7 has('relation') with pagination 减慢查询速度
问题描述
我有过滤器Post::with('media')->has('media')->paginate(50)
我在帖子表中有 350k 行,在媒体中有 270k 行
我在媒体表model_id
和model_type
字段以及帖子表published_at
字段中有索引。
第一个查询:
SELECT
count(*) AS aggregate
FROM
`posts`
WHERE
EXISTS (
SELECT
*
FROM
`media`
WHERE
`posts`.`id` = `media`.`model_id`
AND `media`.`model_type` = 'App\Models\Post'
)
执行:972ms
第二个查询:
SELECT
*
FROM
`posts`
WHERE
EXISTS (
SELECT
*
FROM
`media`
WHERE
`posts`.`id` = `media`.`model_id`
AND `media`.`model_type` = 'App\Models\Post'
)
ORDER BY
`published_at` DESC
LIMIT 50 OFFSET 0
执行:1.7s
解决方案
Count 只会返回1 行
你的select *
50只需要时间。
并检查 2 个查询之间的区别尝试EXPLAIN
EXPLAIN SELELCT...
所以你对mysql对你的查询所做的事情有更好的了解
推荐阅读
- azure-devops - Azure 管道复制文件任务
- asp.net-identity - Asp.Net Identity 检查 tokenlifespan 时间为两个因素
- javascript - 带有时间戳的对象数组的日期过滤[图表添加]
- snakemake - 用于输出文件命名的 Snakefile 和通配符/正则表达式
- python - scikit-learn 在 make_scorer 中苦苦挣扎
- javascript - 终止 JavaScript 中的处理程序执行
- android - Android Studio 错误:程序类型已存在:org.objectweb.asm.Edge
- java - 用于文本文件处理的 Java 多线程
- r - R中时间序列缺失数据的插补模型
- python - 从单词搜索游戏中找到解决方案