Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从另一个表的数据更新表中的多个列的最快方法是什么?_Mysql_Performance - Fatal编程技术网

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

Mysql 从另一个表的数据更新表中的多个列的最快方法是什么?,mysql,performance,Mysql,Performance,我有这两个查询,它们可以工作,但它们尽可能慢。什么是更快的,或者说是最快的方法 方法1) 方法2) 不确定其他方法是否会更快: 方法3) 我尝试的另一件事是,构建整个查询,然后一次执行所有查询,这比上面提到的要快一点,但仍然像垃圾一样慢。上面是每1000条记录9分钟,下面是每1000条记录5分钟 方法4) 是否有更好更快的方法使用另一个表中的数据更新一个表中多条记录中的多列 CREATE TABLE list_data ( id int(11) NOT NULL AUTO_INCREME

我有这两个查询,它们可以工作,但它们尽可能慢。什么是更快的,或者说是最快的方法

方法1)

方法2)

不确定其他方法是否会更快:

方法3)

我尝试的另一件事是,构建整个查询,然后一次执行所有查询,这比上面提到的要快一点,但仍然像垃圾一样慢。上面是每1000条记录9分钟,下面是每1000条记录5分钟

方法4)

是否有更好更快的方法使用另一个表中的数据更新一个表中多条记录中的多列

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

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

ALTER TABLE list_data 
ADD INDEX serial_idx (serial_no);

ALTER TABLE list_data_extra 
ADD INDEX serial_idx (serial_no);

方法1和2是等效的<代码>使用只不过是MySQL为完全相同的操作提供的一种简写符号。它们应该是最快的解决方案。两个表上是否都有
serial\u no
索引?方法3的一个变体可能与我的第二个选择类似,但我会将准备好的语句与
mysqli
pdo
一起使用。此外,为了清楚起见,并记录在案,“更新多个列”不太可能是问题的原因。我一直听说这种列索引。我不确定。你是怎么做到的?我如何检查它是否已经像那样了;要创建或。转到命令提示符并打开mysql命令提示符,并显示创建表数据库\u name.list\u数据,但它没有做任何操作。我刚转到下一个空白的mysql命令提示符。所以我想我不知道在哪里运行这些命令。一旦两个表都有了索引,查询中的语法会改变吗?我没有看到“使用原始查询重试”。是的,这看起来很有魅力。谢谢。不确定区别,但我对这两个表都是这样做的:创建索引serial\u idx ON list\u data\u extra(serial\u no)语法用于正常查询不需要更改,索引基本上只是告诉MySQL对数据进行(排序)预排序,以便更快地搜索和匹配。我猜
创建索引
也会做同样的事情;我通常只使用
altertable
语法。
$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);
    }
}
$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
ALTER TABLE list_data 
ADD INDEX serial_idx (serial_no);

ALTER TABLE list_data_extra 
ADD INDEX serial_idx (serial_no);