【发布时间】:2017-05-22 11:14:24
【问题描述】:
我正在尝试更新一个包含超过 100k 行的大表。我正在从应用 preg_match 的表中获取数据,然后用新值再次更新表。
问题是更新数据库中的所有记录需要几个小时。
我正在使用的代码
$sql = "SELECT id, city_hotel, state, cc1 FROM hotel_names";
$result = $conn->query($sql);
$array = array();
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$array[] = $row;
}
}
foreach ($array as $arr)
{
if (preg_match_all('/\(([A-Za-z0-9 ]+?)\)/', $arr['city_hotel'], $out))
{
if(!empty($out))
{
$STATE[] = $out[1];
//print_r($STATE);
foreach ($STATE as $state)
{
$st = $state[0];
print_r($state) ;
$stmt = $conn->prepare("UPDATE hotel_names SET state = ? WHERE id = ? ");
$stmt->bind_param('ss' ,$st, $arr['id']);
$stmt->execute();
echo "State Updated <br>";
if(preg_replace("/\([^)]+\)/","",$arr['city_hotel']))
{
$city = preg_replace("/\([^)]+\)/","",$arr['city_hotel']);
//echo $city = trim($city).'<br>';
$stmt = $conn->prepare("UPDATE hotel_names SET city_hotel = ? WHERE id = ? ");
$stmt->bind_param('ss' , $city, $arr['id']);
$stmt->execute();
echo "City Updated <br>";
}
}
}
}
}
【问题讨论】:
-
你能用 2-3 个虚拟记录显示你的表模式吗?
-
使用prepared statements的一个好处是你准备一次并且使用多次。因此,在开始时准备两个更新(使用不同的变量来保存每个更新),然后为每个更新绑定并执行。
-
在high speed ingestion 和big deletes (or updates) 上查看我的文章。
标签: php mysql sql performance