索引“的最佳方法”;更新;带“的声明;其中;在mysql中
我使用的是Laravel&MySQL,我有一个“更新”语句,它需要很长时间才能执行,我正试图以最好的方式对它进行优化 以下是我的查询,大约需要700毫秒:索引“的最佳方法”;更新;带“的声明;其中;在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条记录 关于如
更新
表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方面的事情