Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel中优化增量查询?_Php_Mysql_Laravel - Fatal编程技术网

Php 如何在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.

在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.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]%

可能在执行查询时表被锁定。

  • 不要使用
    引擎=MyISAM
    ;切换到InnoDB

  • 小心其他查询(在其他连接中)长时间接触此表


如果不了解更多关于posts表的信息,很难判断。您是否可以手动运行查询,并在查询前添加
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行,从而在多个连接访问表时允许更好的“并发性”。