2012-03-27 7 views
5

Ich bin "ok" bei grundlegenden MySQL, aber das ist "WAY OVER MY HEAD"!Wie importiert man Datenbanken, aktualisiert Produkte, die geändert wurden, lösche Produkte, die entfernt wurden

Ziele:

  • Import Datenbank
  • Update Produkte, die
  • löschen Produkte geändert haben, die
  • Schnell und effizient

Die Datenbanktabelle (n) sind entfernt worden sind RIESIG, Geschwindigkeit ist ein Problem.

Muss MyISAM nicht wäre inoDB schneller? Jede Datenbank befindet sich in einer eindeutigen Tabelle.

ich dies als Ausgangspunkt gegeben, was ich versuche zu tun:

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. 

Antwort

4

ich diese Frage selbst beantwortet: https://dba.stackexchange.com/questions/16197/innodb-update-slow-need-a-better-option/16283#16283

Mit Hilfe der Informationen, die ich von hier erhalten haben, die Bahn und mehrere Internet-Chatrooms, ich habe kommen mit. Web Quelle: 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 

Der Prozess ist:

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. 

dies die schnellsten Prozesse scheint so weit.

Lassen Sie mich wissen, was Ihre Meinung ist.

2

InnoDB ist in der Regel viel besser als MyISAM an Tischen zur Verfügung steht, während INSERT, UPDATE und DELETE passiert, weil InnoDB Sperren auf Zeilenebene für Updates verwendet, während MyISAM Sperren auf Tabellenebene verwendet.

Das ist der erste Schritt.

Der zweite Schritt besteht darin, alle Indizes in der Tabelle zu deaktivieren, bevor Daten in eine Tabelle geladen werden, indem ALTER TABLE .. DISABLE KEYS verwendet und diese nach dem Laden mit ALTER TABLE .. ENABLE KEYS wieder aktiviert werden.

Die obigen zwei zeigen große Verbesserungen in Ihrer Leistung.

Als eine weitere Optimierung, wenn Sie große Aktualisierungen vornehmen, brechen sie in Stapel (vielleicht auf der Grundlage des Primärschlüssels), so dass nicht alle Zeilen gleichzeitig gesperrt sind.

+0

Danke für die Information InnoDB ist es. Ich weiß nicht, ob Sie zufällig wissen, aber der "> INSERT INTO' product_table' VALUES "Teil macht das nicht für mich ... Ich denke es fehlt etwas da ... – Brad

+0

es beantwortet nicht das ganze Frage .... Es beantwortet jedoch einige nützliche Informationen nicht. – Brad