Mysql Laravel 7具有(';relation';)和分页功能,降低了查询速度
我有过滤器Mysql Laravel 7具有(';relation';)和分页功能,降低了查询速度,mysql,laravel,Mysql,Laravel,我有过滤器Post::with('media')->has('media')->paginate(50) 我在post表中有350k行,在媒体中有270k行 我在媒体表model\u id和model\u type字段中有索引,并在字段中发布了posts表 第一个问题: SELECT count(*) AS aggregate FROM `posts` WHERE EXISTS ( SELECT * FROM
Post::with('media')->has('media')->paginate(50)
我在post表中有350k行,在媒体中有270k行
我在媒体表model\u id
和model\u type
字段中有索引,并在字段中发布了posts表
第一个问题:
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计数只返回1行
您的选择*
50,这只需要花费时间
要检查两个查询之间的差异,请尝试
因此,您可以更好地了解mysql对您的查询所做的操作我看到了解释,并且这一使用在两个查询的
索引处发布了
我没有解释其他内容,这就是为什么我解释了为什么您看到其他运行时分页
将选择计数(*)
来计算总数。也许你可以改用simplePaginate。是的,simplePaginate可以解决这个问题,但我需要知道这个问题的解决方案。
EXPLAIN SELELCT...