【发布时间】:2013-02-14 23:00:33
【问题描述】:
我有一个包含 300 000 条记录的表。在这个表中有重复的行,我想更新列“标志”
表格
------------------------------------
|number | flag | ... more column ...|
------------------------------------
|ABCD | 0 | ...................|
|ABCD | 0 | ...................|
|ABCD | 0 | ...................|
|BCDE | 0 | ...................|
|BCDE | 0 | ...................|
我使用此查询来更新“标志”列:
UPDATE table i
INNER JOIN (SELECT number FROM table
GROUP BY number HAVING count(number) > 1 ) i2
ON i.number = i2.number
SET i.flag = '1'
对于这 300 000 条记录,此查询的工作非常缓慢(超过 600 秒)。
如何优化这个查询?
我的表结构
CREATE TABLE IF NOT EXISTS `inv` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pn` varchar(10) NOT NULL COMMENT 'Part Number',
`qty` int(5) NOT NULL,
`qty_old` int(5) NOT NULL,
`flag_qty` tinyint(1) NOT NULL,
`name` varchar(60) NOT NULL,
`vid` int(11) NOT NULL ,
`flag_d` tinyint(1) NOT NULL ,
`flag_u` tinyint(1) NOT NULL ,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `pn` (`pn`),
KEY `name` (`name`),
KEY `vid` (`vid`),
KEY `pn_2` (`pn`),
KEY `flag_qty` (`flag_qty`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
如果“名称”重复,我想更新 flag_qty
【问题讨论】:
-
什么是表结构?此表是否有可用的主键?
-
设置这个标志的目的是什么?您是否正在根据此标志进行进一步处理?
-
-
所有其他列的数据是否也是重复的,或者它们是否具有不同的值?我问这些问题是因为我怀疑您正在尝试做的事情有更好的解决方案吗?这是一次性重复数据删除过程还是经常发生?你如何结束重复?如果您不想重复,为什么
number不是主键(或至少有一个唯一键)? -
其他列的数据不同。数字匹配,但另一列(“...更多列...”)中的信息不重复。出于这个原因,我想更新字段标志。
标签: mysql optimization