从更新表列是什么的另一个表的数据更新表中的多个列的最快方法是什么?

时间:2016-06-20 19:23:01

标签: mysql performance

我有这两个查询有效,但它们很慢。什么是更快,或更快的方式?

方法1)

$query = "
    UPDATE list_data_extra 
    INNER JOIN list_data 
    ON (list_data_extra.serial_no = list_data.serial_no) 
    SET 
    list_data_extra.id = list_data.id, 
    list_data_extra.cid = list_data.cid, 
    list_data_extra.first = list_data.first, 
    list_data_extra.last = list_data.last, 
    list_data_extra.tracking_number = list_data.tracking_number 
    WHERE list_data_extra.id='0' AND list_data_extra.cid='0'
    ";

方法2)

$query = "UPDATE list_data_extra
      INNER JOIN list_data USING (serial_no)
      SET list_data_extra.id = list_data.id,
          list_data_extra.cid = list_data.cid,
          list_data_extra.first = list_data.first, 
          list_data_extra.last = list_data.last, 
          list_data_extra.tracking_number = list_data.tracking_number
     WHERE list_data_extra.id='0'
       AND list_data_extra.cid='0'";

不确定其他方法会更快:

方法3)

$query="SELECT * FROM list_data_extra WHERE id='0' AND cid='0'";
$result=mysql_query($query);
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
    while($row=mysql_fetch_array($result)) {
        $querytwo = mysql_fetch_array(mysql_query(
      "SELECT id, cid, first, last, tracking_number
         FROM list_data
        WHERE serial_no='".$row['serial_no']."'"), MYSQL_ASSOC);
        $querythree = "UPDATE list_data_extra
               SET id='".$querytwo["id"]."', cid='".$querytwo["cid"]."',
                   first='".$querytwo["first"]."', last='".$querytwo["last"]."',
                   tracking_number='".$querytwo["tracking_number"]."'";
        mysql_query($querythree);
    }
}

我尝试的另一件事就是这个,它构建整个查询然后一次执行它,这比上面快一点,但仍然像垃圾一样慢。以上就像每1000条记录中的9分钟一样,下面的内容大概是每1000分钟5分钟。

方法4)

$query="SELECT * FROM list_data_extra WHERE id='0' AND cid='0'";
$result=mysql_query($query);
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
    $id_loop = "";
    $cid_loop = "";
    $first_loop = "";
    $last_loop = "";
    $trackingnumber_loop = "";
    $listids = "";
    while($row=mysql_fetch_array($result)) {
        $querytwo = mysql_fetch_array(mysql_query("SELECT id, cid, first, last, tracking_number FROM list_data WHERE serial_no='".$row['serial_no']."'"), MYSQL_ASSOC);
        $id_loop .= "WHEN ".$row['listid']." THEN '".$querytwo["id"]."' ";
        $cid_loop .= "WHEN ".$row['listid']." THEN '".$querytwo["cid"]."' ";
        $first_loop .= "WHEN ".$row['listid']." THEN '".$querytwo["first"]."' ";
        $last_loop .= "WHEN ".$row['listid']." THEN '".$querytwo["last"]."' ";
        $trackingnumber_loop .= "WHEN ".$row['listid']." THEN '".$querytwo["tracking_number"]."' ";
        $listids .= ", ".$row['listid'];
    }
    $listidsb = substr($listids, 2);
    $querythree = "UPDATE list_data_extra
    SET 
    id = CASE listid
        ".$id_loop."
    END,
    cid = CASE listid
        ".$cid_loop."
    END,
    first = CASE listid
        ".$first_loop."
    END,
    last = CASE listid
        ".$last_loop."
    END,
    tracking_number = CASE listid
        ".$trackingnumber_loop."
    END
    WHERE listid IN (".$listidsb.")";
    mysql_query($querythree) or die(mysql_error());
}

是否有更好更快的方法来更新一个表中许多记录中的多列以及另一个表中的数据?

CREATE TABLE list_data (
    id int(11) NOT NULL AUTO_INCREMENT, 
    cid int(11) NOT NULL, 
    first varchar(255) NOT NULL, 
    last varchar(255) NOT NULL, 
    tracking_number varchar(255) NOT NULL, 
    serial_no varchar(9) NOT NULL, 
    PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=555555 DEFAULT CHARSET=latin1

1 个答案:

答案 0 :(得分:2)

未经索引的JOINWHERE条件可能会很慢,特别是如果它们涉及字符串数据;尝试运行这两个(如果表很大,它们会花一点时间运行),然后再次尝试原始查询。

ALTER TABLE list_data 
ADD INDEX serial_idx (serial_no);

ALTER TABLE list_data_extra 
ADD INDEX serial_idx (serial_no);