2012-03-27 22 views
5

Tôi là "ok" ở MySQL cơ bản, nhưng đây là "WAY OVER MY HEAD"!Cách nhập cơ sở dữ liệu, cập nhật các sản phẩm đã thay đổi, xóa các sản phẩm đã bị xóa

Mục tiêu:

  • cơ sở dữ liệu nhập
  • cập nhật sản phẩm đã thay đổi
  • sản phẩm xóa đã được gỡ bỏ
  • nhanh chóng và hiệu quả

Bảng cơ sở dữ liệu (s) là HUGE, tốc độ là một vấn đề.

Không phải MyISAM là inoDB sẽ nhanh hơn? Mỗi cơ sở dữ liệu sẽ nằm trong một bảng duy nhất.

tôi đã được đưa ra này như là một nơi bắt đầu với những gì tôi đang cố gắng để làm:

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. 

Trả lời

4

Tôi đã trả lời câu hỏi này bản thân mình ở đây: https://dba.stackexchange.com/questions/16197/innodb-update-slow-need-a-better-option/16283#16283

Sử dụng thông tin mà tôi đã nhận được từ đây, các trang web và một số phòng internet chat, tôi đã đi lên với. nguồn Web: 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 

Quá trình này là:

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. 

này dường như các quy trình nhanh nhất cho đến nay.

Hãy cho tôi biết ý kiến ​​của bạn là gì.

2

InnoDB thường là tốt hơn nhiều so với MyISAM tại bảng là có sẵn trong khi INSERT, UPDATEDELETE đang xảy ra, vì InnoDB sử dụng khóa cấp hàng để cập nhật trong khi MyISAM sử dụng khóa cấp bảng.

Đó là bước đầu tiên.

Bước thứ hai là tắt tất cả chỉ mục trên bảng trước khi tải dữ liệu vào bảng sử dụng ALTER TABLE .. DISABLE KEYS và sau đó bật lại sau khi tải bằng cách sử dụng ALTER TABLE .. ENABLE KEYS.

Hai điều trên cho thấy những cải thiện lớn về hiệu suất của bạn.

Khi tối ưu hóa khác, khi thực hiện cập nhật quy mô lớn, hãy chia nhỏ chúng thành các lô (có thể dựa trên khóa chính) sao cho tất cả các hàng không bị khóa đồng thời.

+0

Cảm ơn thông tin InnoDB. Tôi không biết nếu bạn tình cờ biết, nhưng phần "INSERT INTO' product_table' VALUES "không làm cho tôi ... Tôi nghĩ rằng nó thiếu một cái gì đó ở đó ... – Brad

+0

nó không trả lời toàn bộ câu hỏi .... Nó không trả lời một số thông tin hữu ích mặc dù. – Brad

Các vấn đề liên quan