初学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 |
id |
info |
time |
1 |
模型关联查询的性能好 |
2019-11-08 |
2 |
left join 查询的性能好 |
2019-11-08 |
3 |
两个都挺好 |
2019-11-08 |
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,数据量小的时候用模型
。
从得的的结论来看,模型并适合大数据查询,但是对一些新增、修改、删除操作提供了很好的效果!