【问题标题】:Updating a large MySQL table without any key/index information在没有任何键/索引信息的情况下更新大型 MySQL 表
【发布时间】:2014-07-26 23:06:27
【问题描述】:

我想我知道问题出在哪里,但我需要一些帮助才能朝着正确的方向前进。

我有一个“产品”表,还有几个用于不同供应商的 temp_product 表。

这里的目标是从相应的 temp_product 表中更新 products 表中的几个字段。我的产品供应商给了我一个包含所有库存数据的 CSV 文件。最初我只是循环遍历 CSV 并逐行更新,但这需要很长时间,所以现在我使用 LOAD DATA LOCAL INFILE 将其加载到临时表中。

我遇到的问题是 UPDATE 查询需要永远运行,而且大多数时候 MySQL 完全崩溃了。我希望我可以向您展示我的表结构,并且有人可以帮助我了解哪种键/索引设置最有效?

我尝试了 2 种不同的更新查询变体,但都没有奏效。

UPDATE product AS p, temp_product AS t
    SET p.quantity = t.quantity,
        p.ean = t.inventory,
        p.cost = t.price,
        p.date_modified = NOW()
    WHERE p.sku = t.sku

-和-

UPDATE temp_product AS t
    INNER JOIN product AS p ON p.sku = t.sku
    SET p.quantity = t.quantity,
        p.ean = t.inventory,
        p.cost = t.price,
        p.date_modified = NOW()

这是我的表格的结构:

临时产品

sku varchar(15) PRI
status  varchar(2)
statusid    int(11)
quantity    int(11)
inventory   varchar(15)
ETA varchar(25)
ETA_Note    varchar(255)
price   double(10,2)

产品

product_id  int(11) PRI
model   varchar(64)
sku varchar(64)
upc varchar(50)
ean varchar(50)
mpn varchar(64)
location    varchar(128)
quantity    int(4)
price   decimal(15,4)
cost    decimal(15,4)
status  tinyint(1)
date_added  datetime
date_modified   datetime

我有一种感觉,如果我正确设置了键/索引,我可以让它正常工作。我现在唯一设置的是主键,但这些并没有在所有表中匹配。我对这一切都很陌生,所以任何帮助将不胜感激。

为了让事情变得更复杂,我不确定我的一些供应商是否使用相同的 SKU,所以我想更新产品表 WHERE sku = sku 和 location = 'suppliername'。

感谢您的帮助!

编辑:稍微缩小了问题,最初有一个产品和供应商产品表要更新,一旦我让产品表工作,我可能可以从那里得到它。

【问题讨论】:

    标签: mysql sql csv large-data


    【解决方案1】:

    首先,你能运行SHOW CREATE TABLE product;SHOW CREATE TABLE temp_product; 并粘贴结果吗?另外,您的产品表到底有多大? (select count(1) from products 可以帮忙)

    关于密钥:您至少需要将sku 密钥添加到您的product 表中。

    如果sku 应该是一个唯一字段,那么您可以使用以下命令来完成:

    ALTER TABLE product ADD UNIQUE KEY sku(sku);
    

    如果sku 不是唯一字段,那么您仍然可以将其添加为这样的键:

    ALTER TABLE product ADD KEY sku(sku);
    

    但在这种情况下,这意味着对于 temp_product 表中具有特定 sku 的一条记录,您将更新 product 表中的多条记录。

    关于表大小:即使表很大(比如几百万行),但运行需要大量时间的查询(例如,如果您是唯一使用此数据库的人)然后在您之后已经添加了密钥,原则上任何一个变体都应该工作并且比现在花费更少的时间。否则,您最好分批进行更新(例如,一次 100、500 或 1000 条记录),最好使用一些脚本,这些脚本甚至可能在更新之间稍等片刻。如果您的数据库是复制到从属的主数据库,则特别推荐这样做。

    【讨论】:

    • 感谢您的帮助,这正是我需要的答案。我实际上只是想通了,刷新了页面,然后看到了您的回复。我的解决方案是向我所有表的 SKU 字段添加一个索引(与键相同)。查询时间从 30 分钟缩短到了几秒钟。
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 2019-05-03
    • 2013-06-17
    相关资源
    最近更新 更多