更新没有任何键/索引信息的大型MySQL表

时间:2014-06-05 19:44:44

标签: mysql sql csv large-data

我想我知道问题是什么,但我需要一些正确方向的帮助。

我有一张桌子和产品,而且我还为各种供应商提供了几个临时产品表。

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

我遇到的问题是UPDATE查询需要永远运行,并且大多数时候MySQL完全崩溃。我希望我能告诉你我的表格结构,有人可以帮我解决哪种键/索引设置效果最好?

我尝试了两种不同的更新查询变体,但两者都没有工作。

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()

以下是我所讨论的表格的结构:

temp_product

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&#39 ;

感谢您的帮助!

编辑:稍微减少了问题,最初有一个产品和supplier_product表要更新,一旦我得到产品表工作,我可以从那里拿它。

1 个答案:

答案 0 :(得分:0)

首先,您可以运行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条记录),最好使用某些脚本,甚至可能在更新之间等待一段时间。如果您的数据库是复制到从属服务器的主数据库,则特别推荐使用此方法。