Dai Chong's blog

初学Laravel

最近接手一个新项目,整个项目完全看不到left join这样的写法,我打印了模型关联查询后的sql后发现跟常有的查询写法完全不同。
原谅我一直是个码农,几乎没见过这样的写法,一直想对比一下这样的写法和常用的写法性能方面到底有什么差别。

一个小栗子

模型关联生成的sql

1
select * from `comment` where exists (select * from `post_comment` where `comment`.`id` = `post_comment`.`comment_id` and `post_id` = ?)

常用查询

1
SELECT `comment`.id,`comment`.info,`comment`.user_id from `comment` left join post_comment on `comment`.id = `post_comment`.comment_id where post_comment.post_id = ?

单从sql上看区别还是挺大的,再做码农的期间,最常听到的就是链表查询性能不好。但是还真不能确定这两个sql到底哪个性能好一点,没办法只能测试一下。

posts Tables

id title time
1 模型关联查询 2019-11-08
2 left join 查询 2019-11-08

comment Tables

id info time
1 模型关联查询的性能好 2019-11-08
2 left join 查询的性能好 2019-11-08
3 两个都挺好 2019-11-08

post_comment Tables

id post_id comment_id
1 1 1
2 2 2
3 3 2

为了避免争议,我添加了一些比较合理的数据。

数据量

posts comment post_comment
29999条 29999条 29999条

下面使用EXPLAIN进行分析

1
EXPLAIN select * from `comment` where exists (select * from `post_comment` where `comment`.`id` = `post_comment`.`comment_id` and `post_id` = 2)
select_type table partitions type
PRIMARY comment NULL ALL
DEPENDENT SUBQUERY post_comment NULL ref
possible_keys key key_len ref
NULL NULL NULL NULL
post_id,comment_id post_id 5 const
rows filtered Extra
29999 100.00 Using where
1 10.00 Using where
1
EXPLAIN SELECT `comment`.id,`comment`.info,`comment`.user_id from `comment` left join post_comment on `comment`.id = `post_comment`.comment_id where post_comment.post_id = 2
select_type table partitions
SIMPLE post_comment NULL
SIMPLE comment NULL
type possible_keys key key_len
ref post_id,comment_id post_id 5
eq_ref PRIMARY PRIMARY 4
ref rows filtered Extra
const 1 100.00 Using where
test.post_comment.comment_id 1 100.00 NULL

从上边的EXPLAIN结果来看,left join比模型关联的写法效率高太多了,之后我在laravel社区也发布了相关的提问,得到的结论是数据量大的时候用JOIN,数据量小的时候用模型

从得的的结论来看,模型并适合大数据查询,但是对一些新增、修改、删除操作提供了很好的效果!


 评论