使用MySQL在大型表上运行更新非常慢

时间:2013-06-29 14:09:04

标签: mysql performance database-design database-performance

我使用UPDATE通过匹配m2到n1来填充m3中的缺失值,在n2中找到相应的值,然后将其插入到m3中。表mmm有250万行,表nnn有55,000行。

以下两个查询都有效,但问题在于性能。现在,我正在以零敲碎打的方式更新mmm。我已将nnn减少到前10,000行。在这种情况下,这个部分查询在7小时后完成了我想要完成的大约18%。这种方法的问题是我必须以这种方式进行大约10次查找。我知道这是很多计算,但我认为有更好的方法。

有什么方法可以加快这个过程吗?我很感激反馈。

查询#1

UPDATE mmm, nnn
SET mmm.m3 = nnn.n2
WHERE mmm.m2 = nnn.n1

查询#2

UPDATE  mmm a
   INNER JOIN nnn b
      ON b.n1 = a.m2
SET a.m3 = b.n2
WHERE   b.n1 = a.m2 

表格mmm(只有组合是唯一的)

m1            m2             m3
0002-1962     0025117388   
0002-1962     14644418453    
0003-2417     0026708363

表格nnn(n1是唯一的)

n1            n2
0025117388    1111-2222 
14644418453   1515-2323
0026708363    1515-2323

数据库结构:

CREATE TABLE `mmm` (
  `m1` char(9) NOT NULL DEFAULT '',
  `m2` varchar(11) NOT NULL DEFAULT '',
  `m3` char(9) NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `nnn` (
  `n1` varchar(11) NOT NULL DEFAULT '',
  `n2` char(9) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:4)

您可以在查询前使用EXPLAIN来查看mysql如何处理执行。如果没有任何索引可以使用,则必须对250万行进行全表扫描,以便从mmm中进行选择。首先指定主键,以便mysql可以将它们用作查询的索引。您可能会发现还需要在m2列中添加非唯一索引以加快选择速度。

CREATE TABLE `mmm` (
  `m1` varchar(9) NOT NULL DEFAULT '',
  `m2` varchar(11) NOT NULL DEFAULT '',
  `m3` varchar(9) NULL DEFAULT '',
  primary key (m1, m2, m3)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `nnn` (
  `n1` varchar(11) NOT NULL DEFAULT '',
  `n2` varchar(9) NOT NULL DEFAULT '',
  primary key (n1)
) ENGINE=InnoDB DEFAULT CHARSET=utf8