首页 > 解决方案 > Laravel 7 has('relation') with pagination 减慢查询速度

问题描述

我有过滤器Post::with('media')->has('media')->paginate(50) 我在帖子表中有 350k 行,在媒体中有 270k 行

我在媒体表model_idmodel_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

标签: mysqllaravel

解决方案


Count 只会返回1 行

你的select * 50只需要时间。

并检查 2 个查询之间的区别尝试EXPLAIN

EXPLAIN  SELELCT...

所以你对mysql对你的查询所做的事情有更好的了解


推荐阅读