Php 如何在Laravel中优化增量查询?
在Laravel项目中,我根据会话增加视图,我使用它的方式如下:Php 如何在Laravel中优化增量查询?,php,mysql,laravel,Php,Mysql,Laravel,在Laravel项目中,我根据会话增加视图,我使用它的方式如下: $post=post::whereSlug($slug)->firstOrFail(); $postKey='post_389;。$post->id; 如果(!Session::has($postKey)){ $post->increment('views'); 会话::put($postKey,1); } 有没有办法优化这个?我已经激活了慢速查询日志,我得到的结果如下: # Time: 2021-04-03T12:05:20.
$post=post::whereSlug($slug)->firstOrFail();
$postKey='post_389;。$post->id;
如果(!Session::has($postKey)){
$post->increment('views');
会话::put($postKey,1);
}
有没有办法优化这个?我已经激活了慢速查询日志,我得到的结果如下:
# Time: 2021-04-03T12:05:20.992056Z
# User@Host: user[user] @ localhost [127.0.0.1] Id: 168408
# Query_time: 2.843047 Lock_time: 0.000029 Rows_sent: 0 Rows_examined: 1;
update `posts` set `views` = `views` + 1, `posts`.`updated_at` = '2021-04-03 12:05:18' where `id` = 163518;
如何对此进行优化?有什么建议吗
编辑:添加手册解释更新
语句:
EXPLAIN update `posts` set `views` = `views` + 1, `posts`.`updated_at` = '2021-04-03 12:05:18' where `id` = 163518;
结果:集合中有1行(0.01秒)
身份证件
选择类型
桌子
分割
类型
可能的\u键
钥匙
基伦
裁判
排
过滤
额外的
1.
更新
帖子
无效的
范围
主要的,重要的
主要的,重要的
4.
常数
1.
100
在哪里使用
该查询已尽可能优化 没有涉及连接。过滤(使用where)由主键完成,
行
=1和过滤
=100表示查询希望访问[1]行并返回[100]%
可能在执行查询时表被锁定。- 不要使用
;切换到InnoDB引擎=MyISAM
- 小心其他查询(在其他连接中)长时间接触此表
EXPLAIN UPDATE
posts``并显示结果?请看:@dbrumann是的,我会更新它。哪个查询比较慢?更新查询看起来很好,我怀疑slug()太慢了。你可以尝试在slug字段上创建索引。@AnuratChapanond谢谢,我没有在slug上设置索引,我现在将添加它,看看它如何保持。您好,谢谢您的回答,在我的数据库配置文件中,mysql引擎是空的,我可以将它设置为InnoDB
,如果默认为空,则由d设置为MyISAM
efault?@DarkBoss-你在哪里看到了NULL
?显示变量,如“default\u storage\u engine”;
会告诉你默认值是什么。然后这取决于你使用的是什么版本的MySQL/MariaDB。旧版本默认为MyISAM;新版本默认为InnoDB。谢谢,表被锁定是什么意思?抱歉如果我不完全理解您的意思,这是我第一次尝试优化性能,所以对我来说这是非常新的。如果在此之前有另一个查询正在修改表,则数据库会锁定该表,直到该查询完成,以避免以后发生数据冲突。@DarkBoss-MyISAM在任何写入时都会锁定整个表。InnoDB只锁定relevant行,从而在多个连接访问表时允许更好的“并发性”。