【问题标题】:Indexing for quick JOINs between a regularly truncated table and a large table in MySQL在 MySQL 中为定期截断的表和大表之间的快速连接建立索引
【发布时间】: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


    【解决方案1】:

    您当然希望有表的索引。在表二上,在截断表并重新加载数据之前删除索引。重新加载数据后,重新创建索引。

    【讨论】:

    • 听起来像是一个计划。如果您没有指出,我什至不会想到在截断之前删除索引。有一次,我遇到了一篇关于 MySQL 不同类型索引的博客文章,特别是关于表 JOIN 的文章。 IIRC,它描述了一些正常索引可能无法加快速度的情况。对于我的生活,我找不到它。不管怎样,我会听取你的建议,看看结果如何。如果它不能解决所有问题,我将再次开始搜索该帖子。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多