我有下表:
CREATE TABLE `Product_Category_Rank` (
`CategoryId` SMALLINT(5) UNSIGNED NOT NULL ,
`ProductId` VARCHAR(32) NOT NULL ,
`RankedOn` DATE NOT NULL ,
`PopularityRank` SMALLINT(5) NOT NULL ,
PRIMARY KEY (`CategoryId`, `ProductId`, `RankedOn`) ,
INDEX `fk_Product_Category_Rank_Product` (`ProductId` ASC) ,
INDEX `fk_Product_Category_Rank_Category` (`CategoryId` ASC) ,
CONSTRAINT `fk_Product_Category_Rank_Category`
FOREIGN KEY (`CategoryId` )
REFERENCES `Category` (`CategoryId` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Product_Category_Rank_Product`
FOREIGN KEY (`ProductId` )
REFERENCES `Product` (`ProductId` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
我有一个csv文件(我每天导入),其中包含不到30,000条记录。
我试过了:
LOAD DATA LOCAL INFILE 'temp/product_category_rank.csv'
INTO TABLE `Product_Category_Rank`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\n';
我也尝试将文件加载到临时表中并执行:
INSERT
INTO `Product_Category_Rank` ( ... )
SELECT ...
FROM `tmp_product_category_rank`
两种方法的工作方式相同(结果相同),但我确信第二种方法的资源成本略高。我遇到的问题是每天加载/插入选择功能的导入时间每天增加大约3秒。所以第30天我正在寻找90秒直接进入表格。
事实:导入将从不具有重复的主键(除非我尝试两次导入相同的数据,这不是问题)
那么有没有办法加快这个过程(可能在导入前关闭密钥检查?(怎么样?))
编辑:还要注意,不需要外键检查,因为类别和产品表已经更新,外键约束不是导入的问题。
答案 0 :(得分:1)
解决方案:(显然与查询无关)
MySQL服务器变量:
innodb_buffer_pool_size = 8MB(更改为2GB) innodb_log_file_size = 5MB(改为256MB) innodb_log_buffer_size = 1MB(更改为4MB) innodb_flush_log_at_trx_commit = 1(更改为2)
这些新设置基于以下文章: http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/
现在,当我运行导入时,每天的导入速度不会降低。我已导入30天,每次导入的速度与上次相同。所以它实际上是一个服务器优化问题。