我有过滤器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` = 'AppModelsPost'
)
执行:972ms
第二个查询:
SELECT
*
FROM
`posts`
WHERE
EXISTS (
SELECT
*
FROM
`media`
WHERE
`posts`.`id` = `media`.`model_id`
AND `media`.`model_type` = 'AppModelsPost'
)
ORDER BY
`published_at` DESC
LIMIT 50 OFFSET 0
执行:1.7s
Count只返回1行
和您的select *
50,这只需要时间。
要检查2个查询之间的差异,请尝试EXPLAIN
EXPLAIN SELELCT...
因此,您可以更好地了解mysql对查询所做的工作