MySql查询 - 使用varchars,indexs进行优化,需要花费一个多小时才能运行

时间:2016-05-07 16:55:07

标签: php mysql sql query-optimization

所以我需要运行一个我不知道UUID的查询 - 但需要找到它......所以我使用街道号,街道名称和公司UUID来查找它

我有几百万条记录,这需要查询一小时!!

有什么建议可以加快速度吗?

gisPoints
UUID  Indexed Unique    varchar(36)
street_num  int(11)
street_name varchar(128)

geoPoint_temp
UUID  Indexed Unique    varchar(36)
street_num  int(11)
street_name varchar(128)
gcomUUID Indexed    varchar(36)


update geoPoint_temp as temp JOIN gisPoints as `prod` on prod.gcomUUID=temp.gcomUUIDand prod.street_num=temp.street_num and prod.street_name REGEXP(temp.street_name)
        set temp.UUID=prod.UUID,temp.customerUUID=prod.customerUUID     WHERE temp.`uploadstate` = '1'";

2 个答案:

答案 0 :(得分:1)

假设您有以下值(在PHP中):

$street_num  = ...;//something
$street_name = ...;//something
$gcomUUID = ...;//something

如果运行以下sql代码:

$sql = "SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM geoPoint_temp WHERE gcomUUID = $gcomUUID) 
    WHERE street_name = $street_name)
WHERE street_num = $street_num;"

您应该从geoPoint_temp获取具有匹配值的行列表(0或更多),即使在大表中它也应该相对较快。

获取这些行后,您可以检查行计数是否大于零,如果是,则更新行。如果你使用MySQL(PDO),你可以做类似以下的事情:

$count = $stmt->rowCount();
if ($count>0)
{
  $rows = $stmt->fetchAll();
  foreach ($rows as $row)
  {
    $sql = "UPDATE geoPoint_temp SET ... WHERE UUID = ".$row['UUID'];
    $stmt = $conn->prepare($sql);
    $stmt->execute();
  }
}

如果有帮助,请告诉我。

<强>编辑:

请尝试以下操作并让我知道它是否有效:

$sql = "
UPDATE geoPoint_temp SET ... WHERE UUID IN 
    (SELECT * FROM (
        SELECT * FROM (
            SELECT * FROM geoPoint_temp WHERE gcomUUID = $gcomUUID) 
        WHERE street_name = $street_name)
    WHERE street_num = $street_num);"

...替换为您想要更新的值。

答案 1 :(得分:0)

相对于之前的时间,它在1.5秒内运行 对@Webeng有很多帮助,指出我们正确的方向!

$custquery="UPDATE geoPoint_temp as temp
        join
        (
                        select prod.name, prod.street_num, prod.street_name, prod.UUID,prod.customerUUID, prod.gcomUUID 
                        FROM gisPoints as `prod`
                        JOIN
                        (
                                        select t1.gcomUUID , t1.street_num, t1.street_name
                                        FROM geoPoint_temp as t1
                        ) as sub1 on prod.gcomUUID =sub1.gcomUUID  and prod.street_num=sub1.street_num
        ) as sub2 on sub2.gcomUUID =temp.gcomUUID 
        and sub2.street_num=temp.street_num
        AND sub2.street_name LIKE (CONCAT('%',temp.street_name,'%'))
        set temp.customerUUID = sub2.customerUUID, temp.UUID=sub2.UUID";
        $custre=mysql_query($custquery);
        if (!$custre) {    echo 'Could not run custre query: ' . mysql_error();    exit;    }