我想使用一张表中的百分比份额和另一张表中的总市场规模来计算公司市场份额的价值,并用结果更新前一张表。
我一直在研究很多,但没有找到一个好的答案。所以我只得到了以下查询,Lock wait timeout exceeded
在我将此参数增加到 150 秒后超时。看起来查询是错误的,或者至少效率很低。这是查询:
UPDATE MarketShares AS mShares
JOIN MarketSizes AS mSizes
ON mSizes.year = mShares.year
AND mSizes.category = mShares.category
AND mSizes.countryID = mShares.countryID
SET mShares.mShareValue = mShares.mShare * mSizes.retailYoY /100
WHERE mSizes.year = mShares.year
AND mSizes.emCategory = mShares.emCategory
AND mSizes.countryID = mShares.countryID;
下一个表是目标,它的行数略多于 1 mio:
CREATE TABLE IF NOT EXISTS CA.MarketShares (
marketShareID INT NOT NULL AUTO_INCREMENT ,
category INT NOT NULL,
companyID INT NOT NULL ,
countryID INT NOT NULL,
year INT NULL,
mShare DEC(20,4) NULL,
mShareValue DEC(20,4) NULL,
PRIMARY KEY (emMarketShareID))
下表的retailYoY 变量提供了市场规模信息,并且有大约450K 行:
CREATE TABLE IF NOT EXISTS CA.MarketSizes (
marketSizeID INT NOT NULL AUTO_INCREMENT ,
category INT NOT NULL,
year INT NULL,
countryID INT NOT NULL,
retailYoY DEC(20,2) NULL,
PRIMARY KEY (marketSizeID))
在此先感谢您的帮助!
编辑:EXPLAIN UPDATE..
结果如下:
id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'SIMPLE', 'mShares', 'ALL', 'brandShare_countries', NULL, NULL, NULL, '1048110', NULL
'1', 'SIMPLE', 'mSizes', 'ref', 'marketSize_fk_countries', 'emMarketSize_fk_countries', '4', 'consumeralpha.mShares.countryID', '2485', 'Using where'
看起来该mSizes
表的行数应该 > 400K。