【发布时间】:2011-10-12 12:48:45
【问题描述】:
我有两个定期加入的表。
表一大约有 100 万行,并且每天都在增长。表二总是比表一少大约 200k。此外,表二每晚都会从外部服务下载的报告中截断并重新填充。我使用的 UPDATE..JOIN 查询不是太快,所以我正在寻找可能的补救措施。
Table One 的结构:
#I grow daily and currently am around 1 million rows.
CREATE TABLE table_one(
id INT NOT NULL AUTO_INCREMENT,
sku VARCHAR(30),
other_one VARCHAR(30),
PRIMARY KEY(id)
);
表二的结构:
#I get truncated every night and am about 200k less rows than Table One.
CREATE TABLE table_two(
id INT NOT NULL AUTO_INCREMENT,
sku VARCHAR(30),
other_two INT,
PRIMARY KEY(id)
);
请注意,两个表上的 other_one 和 other_two 字段只是为了证明每个表都有除 id 和 sku 之外的字段(主要是 varchar),但实际上每个表上有许多不同的列。我不确定这是否重要,但 SKU 在表二上是唯一的,但在表一上只有大约 95% 的时间是唯一的。因此,在 MySQL 中的任何一个表上都没有强制唯一性。
这是我的工作流程和问题:
1) 白天将一堆新行添加到表一中。
2)每晚表二被截断(删除所有行)
3) 报告从第三方下载为 CSV 平面文件。然后使用 LOAD DATA LOCAL INFILE 命令将该报告加载到表二中。
4) 运行 3 个查询来更新表一数据并涉及 JOIN。它们看起来都非常相似:
UPDATE table_one t1
JOIN table_two t2 ON t2.sku = t1.sku
SET t1.other_one = "Other two was greater than zero!"
WHERE t1.other_one IS NULL AND t2.other_two > 0
就我拥有的行数而言,在这两个表之间进行 JOIN 似乎会占用相当多的时间。我很好奇,对于 3 个繁重的更新查询,最好为这些表创建一些索引。问题是这些索引很可能必须在每晚填充表二时重新创建。我不知道这会如何影响人口速度,也不知道我应该使用哪种类型的索引。
【问题讨论】:
标签: mysql join indexing truncate