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...