Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 更新查询(包括联接)需要55到59秒来更新表_Php_Mysql_Ajax_Codeigniter - Fatal编程技术网

Php 更新查询(包括联接)需要55到59秒来更新表

Php 更新查询(包括联接)需要55到59秒来更新表,php,mysql,ajax,codeigniter,Php,Mysql,Ajax,Codeigniter,我有一个名为notification的表,该表有近15000行数据。我有两个主要的东西,那就是userid和isRead。我想在用户单击“将所有通知标记为已读”时更新行。但是当用户点击标记为Read时,更新表或运行查询需要55到59秒。我正在用连接更新。这是我的问题 UPDATE notification n , posts p SET n.isRead = 1 Where (n.post_id = p.id and p.userid = $userid) OR

我有一个名为notification的表,该表有近15000行数据。我有两个主要的东西,那就是userid和isRead。我想在用户单击“将所有通知标记为已读”时更新行。但是当用户点击标记为Read时,更新表或运行查询需要55到59秒。我正在用连接更新。这是我的问题

UPDATE notification n
     , posts p 
   SET n.isRead = 1 
 Where (n.post_id = p.id and p.userid = $userid) 
    OR n.toUser = $userid 
   and n.isRead = 0
我不知道为什么更新表行会花费太多时间,但是当查询在这段时间内执行时,我无法在查询处理期间移动到任何其他页面。我还在Post表中创建了userid、isRead和p.userid的索引,但仍然存在相同的问题。我不知道该怎么办

我在codeigniter中通过ajax使用此查询,但响应时间仍然相同

这是我的桌子结构


我怀疑你真的想要这样的东西:

UPDATE notification n
  JOIN posts p 
    ON p.id = n.post_id 
   SET n.isRead = 1 
 WHERE :userid IN (n.toUser,p.userid)

有关查询优化的帮助,请提供上述说明以及两个表的SHOW CREATE TABLE语句。

更新中使用
时,通常更快地将其分解为多个
更新

UPDATE notification n
     , posts p 
   SET n.isRead = 1 
 Where (n.post_id = p.id and p.userid = $userid) 

UPDATE notification n
     , posts p 
   SET n.isRead = 1 
 Where n.toUser = $userid 
   and n.isRead = 0
但是要小心
x或y和z
x或(y和z)
相同,而不是
(x或y)和z

一旦您将其分为两个更新,然后检查您是否为每个更新都有最佳索引

p:  INDEX(userId, id)
n:  INDEX(toUser, isRead)
n:  INDEX(postId)

它不起作用了。。。我想在会话中根据userid更新所有行。在查询中放置用户id的位置。如果我按照您发送给我的方式执行查询,它会显示0行生效。我看不到您的代码,因此无法真正注释我看到了一件未提及的事情:userid将要求您绑定用户id值,它只是一个占位符。或者在execute命令中发送用户id值。