0

在清除所有非数字后,我有一种非常低效的方法来更新数据库中的电话号码。

$san_phone = mysql_query('SELECT * FROM table');

while ($row = mysql_fetch_array($san_phone)) {
    $row['phone_clean'] = preg_replace('#[^\d]#', '', $row['phone']);
    echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';

    mysql_query("UPDATE table SET phone = " . $row['phone_clean']  . " WHERE id = " . $row['id']);
}

循环的更新部分导致我在 2,400 条记录中只有大约 400 条后超时。很明显我做错了什么,所以在教育我时要温柔。;)

4

3 回答 3

1

首先,停止使用mysql_函数,因为它们已被弃用。改用mysqli_orPDO函数。

您用于UPDATE记录的方法效率低下。您应该改为创建一个临时表,INSERT在单个查询中创建新记录,最后运行UPDATE查询来替换数据。

你可以从这个开始:

$san_phone = mysql_query('SELECT id, phone FROM table');
$insertArray = array();

while ($row = mysql_fetch_array($san_phone)) {
    $phone_clean = preg_replace('#[^\d]#', '', $row['phone']);
    echo $row['id'] . ' - ' . $row['phone_clean'] . '<br>';

    $insertArray[] = "(" . $row[id] . ", '" . $phone_clean . "')";
}

$insertQuery = "INSERT INTO tempTable (id, phone) VALUES ";
$insertQuery = implode(", ", $insertArray);
mysql_query($insertQuery);

我做了一个快速演示来说明这个过程。t1是您的原始表,并且t2是包含要替换的数据的临时表。

看到它在行动

于 2012-12-04T00:47:44.023 回答
1

您可以使用类似这样的用户定义函数:

http://www.mysqludf.org/lib_mysqludf_preg/index.php#PREG_REPLACE_SECTION

https://launchpad.net/mysql-udf-regexp

并将您的查询重写为:

UPDATE table
SET phone = PREG_REPLACE('#[^\d]#', '', phone);
于 2012-12-04T00:44:05.863 回答
0

好吧,对数据库的多次调用会导致速度下降,而且(根据我的经验),这是一个痛苦的调用。即使两次访问数据库也可能导致明显延迟超过一次。

为了解决这个问题,您希望最大限度地减少对数据库的调用,这意味着尽可能多地在一次调用中完成。为此,请尝试将其重写为单个 SQL 更新,其中您的替换逻辑位于 SQL 本身中。这意味着只需访问一次数据库并大幅提高速度。

说起来容易做起来难,自从我上次检查以来,MySQL 没有正则表达式字符串替换功能。您可以尝试解决方法,或查看一些 UDF。另一个答案提供了一个链接。我建议调查一下。

于 2012-12-04T00:40:36.690 回答