索引“的最佳方法”;更新;带“的声明;其中;在mysql中

索引“的最佳方法”;更新;带“的声明;其中;在mysql中,mysql,laravel,Mysql,Laravel,我使用的是Laravel&MySQL,我有一个“更新”语句,它需要很长时间才能执行,我正试图以最好的方式对它进行优化 以下是我的查询,大约需要700毫秒: 更新 表1 设置 女子身份证=48, 表1.更新日期='2020-08-26 12:18:48' 哪里 女性身份证为空 最后日期>='2020-08-26' 和man_id=1 订购人 最后日期ASC 极限 100 我添加了一个索引(男人id,女人id,最后一次约会)达到700ms,而没有索引的话它达到4s。 该表包含约90k条记录 关于如

我使用的是Laravel&MySQL,我有一个“更新”语句,它需要很长时间才能执行,我正试图以最好的方式对它进行优化

以下是我的查询,大约需要700毫秒:

更新
表1
设置
女子身份证=48,
表1.更新日期='2020-08-26 12:18:48'
哪里
女性身份证为空
最后日期>='2020-08-26'
和man_id=1
订购人
最后日期ASC
极限
100
我添加了一个索引(男人id,女人id,最后一次约会)达到700ms,而没有索引的话它达到4s。 该表包含约90k条记录


关于如何优化这一点有什么想法吗?

不幸的是,更新的栏目越多,更新的速度就越慢,但有一些方法;其中之一是在PHP端按块更新数据。另一个是Mysql分析表_1来优化索引。另外,由于您正在更新数据,所以可以删除ORDERBY子句

    $result = $db->rawquery("select * from table1 WHERE 
    woman_id is null AND last_date >= '2020-08-26' AND man_id = 1");
    
    // Chunk Results
    $chunk = array_chunk($result, 5000);

         foreach ($chunk as $chunk_arr) {

                  $tmp_arr = array();
                  foreach ($chunk_arr as $segment) {
                       $tmp_arr [] = $segment;
                  }
                  
                  $sql = "insert into table_1 (
                                         colum1,colum2, and so on
                                         ) values ";
                            
                  $array_keys = array_keys($tmp_arr);
                  $last_key = end($array_keys);

                  foreach ($tmp_arr as $key => $data) {
                  if ($last_key == $key) {
                  $sql .= "(" . implode(",", $data) . ") ON DUPLICATE KEY UPDATE woman_id=VALUES(48), updated_at=VALUES('2020-08-26 12:18:48') ";
                  } else {
                  $sql .= "(" . implode(",", $data) . "),";
                  }
                  }

                 

                 $db->rawQuery($sql);
                 unset($tmp_arr);
       }

不幸的是,更新的列越多,更新的速度就越慢,但是有一些方法;其中之一是在PHP端按块更新数据。另一个是Mysql分析表_1来优化索引。另外,由于您正在更新数据,所以可以删除ORDERBY子句

    $result = $db->rawquery("select * from table1 WHERE 
    woman_id is null AND last_date >= '2020-08-26' AND man_id = 1");
    
    // Chunk Results
    $chunk = array_chunk($result, 5000);

         foreach ($chunk as $chunk_arr) {

                  $tmp_arr = array();
                  foreach ($chunk_arr as $segment) {
                       $tmp_arr [] = $segment;
                  }
                  
                  $sql = "insert into table_1 (
                                         colum1,colum2, and so on
                                         ) values ";
                            
                  $array_keys = array_keys($tmp_arr);
                  $last_key = end($array_keys);

                  foreach ($tmp_arr as $key => $data) {
                  if ($last_key == $key) {
                  $sql .= "(" . implode(",", $data) . ") ON DUPLICATE KEY UPDATE woman_id=VALUES(48), updated_at=VALUES('2020-08-26 12:18:48') ";
                  } else {
                  $sql .= "(" . implode(",", $data) . "),";
                  }
                  }

                 

                 $db->rawQuery($sql);
                 unset($tmp_arr);
       }

以这一战略为例,

为(最后日期、男性id、女性id)添加索引

改变 哪里 最后日期>='2020-08-26' 和man_id=1 女人的身份证是空的

让我们知道结果


删除其他多列索引。

考虑此策略

为(最后日期、男性id、女性id)添加索引

改变 哪里 最后日期>='2020-08-26' 和man_id=1 女人的身份证是空的

让我们知道结果


删除另一个多列索引。

现在需要6秒才能完成50的限制,这实际上比旧索引更糟糕index@PedroMarthon请发布解释6s处理的文本结果。考虑运行分析TabLEYNEX,以确保在使用CLENT选择之前运行索引。现在它需要6s来完成限制50,这实际上比旧的更差。index@PedroMarthon请发布解释6s处理的文本结果。考虑运行分析Table名称,以确保索引在运行之前与解释选择……请您详细阐述PHP方面的内容,请您详细说明PHP方面的事情