如何导入数据库,更新已更改的产品,删除已删除的产品
Posted
技术标签:
【中文标题】如何导入数据库,更新已更改的产品,删除已删除的产品【英文标题】:How to Import database, update products that have changed, delete products that have been removed 【发布时间】:2012-04-10 14:46:06 【问题描述】:我在基本的 mysql 上“还可以”,但这是“在我的头上”!
目标:
导入数据库 更新已更改的产品 删除已被移除的产品 快速高效数据库表很大,速度是个问题。
难道不是MyISAM 是inoDB 会更快吗?每个数据库将位于一个唯一的表中。
我被赋予了这个作为我正在尝试做的事情的起点:
CREATE TABLE `table` LIKE LiveTable
LOAD DATA INFILE..... INTO `table`
UPDATE `table` SET delete=1; -- Set the delete field to true because it will not have been updated
UPDATE `table` INNER JOIN`table`ON `LiveTable.ID`=`table.ID`
SET LiveTable.Col1=table.Col1, LiveTable.Col2=table.Col2….. delete=0
INSERT INTO LiveTable(ID,Col1,Col2,… delete=0)
SELECT ID,Col1,Col2,...FROM `table`
LEFT JOIN LiveTable
ON table.ID = LiveTable.ID
WHERE LiveTable.ID IS NULL
DELETE FROM LiveTableWHERE delete = 0
EMPTY TABLE `table`
> CREATE TABLE `product_table` (
> `programname` VARCHAR(100) NOT NULL,
> `name` VARCHAR(160) NOT NULL,
> `keywords` VARCHAR(300) NOT NULL,
> `description` TEXT NOT NULL,
> `sku` VARCHAR(100) NOT NULL,
> -- This is the only "unique identifier given, none will be duplicates"
> `price` DECIMAL(10, 2) NOT NULL,
> `created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
> `updatedat` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
> `delete` TINYINT(4) NOT NULL DEFAULT '0',
> PRIMARY KEY (`sku`) ) ENGINE=myisam DEFAULT CHARSET=latin1;
>
> CREATE TABLE IF NOT EXISTS `temptable` LIKE `product_table`;
>
> TRUNCATE TABLE `temptable`; -- Remove data from temp table if for some
> reason it has data in it.
>
> LOAD DATA LOW_PRIORITY LOCAL INFILE "catalog.csv" INTO TABLE
> `temptable` FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """"
> LINES TERMINATED BY "\n" IGNORE 1 LINES (`PROGRAMNAME`, `NAME`,
> `KEYWORDS`, `DESCRIPTION`, `SKU`, `PRICE`);
>
>
> UPDATE `temptable` SET `delete` = 1; -- Set the delete field to
> true UPDATE `temptable` ttable
> INNER JOIN `product_table` mtable
> ON ( mtable.sku = ttable.sku ) SET mtable.programname = ttable.programname,
> mtable.name = ttable.name,
> mtable.keywords = ttable.keywords,
> mtable.description = ttable.description,
> mtable.sku = ttable.sku,
> mtable.price = ttable.price,
> mtable.created = ttable.created,
> mtable.updatedat = NOW(),-- Set Last Update
> mtable.delete = 0; -- Set Delete to NO
>
> -- Not sure what this is for... I'm LOST at this part...
> INSERT INTO `product_table` VALUES (`programname`,
> `name`,
> `keywords`,
> `description`,
> `sku`,
> `price`,
> `created`,
> `updatedat`,
> `delete`);
>
> -- This type of join requires alias as far as I know?
> SELECT `programname`,
> `name`,
> `keywords`,
> `description`,
> `sku`,
> `price`,
> `created`,
> `updatedat`,
> `delete` FROM `temptable` tmptable
> LEFT JOIN `product_table` maintbl
> ON tmptable.sku = maintbl.sku WHERE maintbl.sku IS NULL;
>
> DELETE FROM `product_table` WHERE `delete` = 0;
>
> TRUNCATE TABLE `temptable`; `` remove all the data from temporary
> table.
【问题讨论】:
【参考方案1】:我自己在这里回答了这个问题: https://dba.stackexchange.com/questions/16197/innodb-update-slow-need-a-better-option/16283#16283
利用我从这里收到的信息、网络和几个互联网聊天室,我想出了。网络来源:http://www.softwareprojects.com/resources/programming/t-how-to-use-mysql-fast-load-data-for-updates-1753.html
[DEMO][1] http://sqlfiddle.com/#!2/4ebe0/1
流程是:
Import into a new temp table.
Update The old table information with information in Temp table.
Insert new data into the table. (Real world I'm making a new CSV file and using LOAD INTO for the insert)
delete everything that is no longer in the data feed.
delete the temp table.
这似乎是迄今为止最快的过程。
让我知道你的意见。
【讨论】:
【参考方案2】:在INSERT
、UPDATE
和DELETE
发生时,InnoDB 通常比 MyISAM 好得多,因为 InnoDB 使用行级锁定进行更新,而 MyISAM 使用表级锁定。
这是第一步。
第二步是在将数据加载到表之前使用ALTER TABLE .. DISABLE KEYS
禁用表上的所有索引,然后在加载后使用ALTER TABLE .. ENABLE KEYS
重新启用它们。
以上两项显示你的表现有很大的提高。
作为另一个优化,在进行大规模更新时,将它们分成批次(可能基于主键),这样所有行不会同时锁定。
【讨论】:
感谢 InnoDB 提供的信息。我不知道你是否碰巧知道,但是 "> INSERT INTOproduct_table
VALUES 部分对我来说没有意义......我认为它在那里遗漏了一些东西......
它没有回答整个问题......虽然它没有回答一些有用的信息。以上是关于如何导入数据库,更新已更改的产品,删除已删除的产品的主要内容,如果未能解决你的问题,请参考以下文章
itunesconnect - 应用内购买产品 ID 已更改
我已使用 selenium web 驱动程序 JAVA 将产品添加到手推车中,然后将其从购物车中删除。我如何断言产品是不是被移除?