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 book
(BOOK_NO
),
KEY period
(PERIOD_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分钟,我怎样才能优化查询?
答案 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并相应地创建密钥。