更新表需要很长时间在mysql?

时间:2017-06-29 09:24:07

标签: mysql

CREATE TABLE fa (    
book varchar(100) DEFAULT NULL,     
PRODUCTION varchar(1000) DEFAULT NULL,        
VENDOR_LEVEL varchar(100) DEFAULT NULL,    
BOOK_NO int(10) DEFAULT NULL,    
UNSTABLE_TIME_PERIOD varchar(100) DEFAULT NULL,    
`PERIOD_YEAR` int(10) DEFAULT NULL,

promo_3_visuals_manual_drag int(10)DEFAULT NULL,
  BOOK_NO int(10)DEFAULT NULL,
  PRODUCT_LEVEL_DIST varchar(100)DEFAULT NULL,
  PRODUCT_LEVEL_ACV_TREND varchar(100)DEFAULT NULL,
  KEY bookBOOK_NO),
  KEY periodPERIOD_YEAR
)ENGINE = InnoDB DEFAULT CHARSET = utf8

我们添加到列的索引 索引:BOOK_NO和PERIODIC_YEAR已添加

我们无法为这两列添加唯一或主键,因为它中包含大量重复值。

有4600万行。

我们尝试将分区划分为期间年份而catno用于子分区,但是因为它仍然需要很长时间而无法工作

当我运行更新查询时:

update fa set UNSTABLE_TIME_PERIOD = NULL  where BOOK_NO = 0 and periodic_year = 201502;    

我花了超过7分钟,我怎样才能优化查询?

2 个答案:

答案 0 :(得分:0)

正如ÁlvaroGonzález所说,你应该使用某种键(例如主键)。

添加主键:

CREATE TABLE fa (
<your_id>,    
{...},
PRIMARY KEY(<your_id>),
{...}
)

CREATE TABLE fa (
<your_id> PRIMARY KEY,
{...}
)

为了方便起见,建立PRIMARY KEY AUTO_INCREMENT也是一个好主意,但这不是必须的。

答案 1 :(得分:0)

不是创建2个不同的键,而是为这两列创建单个复合键,如:

KEY book_period(BOOK_NO,PERIOD_YEAR)

此外,首先根据列来过滤记录,该列将返回与其他记录相比较的小记录集 如果您认为与PERIOD_YEAR相比,BOOK_NO将返回较少的记录数,请先在where子句中使用BOOK_NO,否则先使用PERIOD_YEAR并相应地创建密钥。