在InnoDB中,csv上传比MyiSAM慢得多

时间:2013-12-02 12:09:26

标签: mysql csv innodb myisam

我正在使用MySQL 5.5.34。

我们有一个环境,我们每天在数据库中上传大约1GB的csv文件,所有的表都是MyISAM,直到现在。现在我们计划在很多时候遇到表锁,切换到InnoDB。

坦率地说,每一秒都值得我们许多玩家。

我们在InnoDB&创建了相同的表格。试图上传csv文件。令我们惊讶的是,InnoDB比MyISAM花费了数小时。所以,再次测试一下,我在我的机器上创建了一个测试环境。我有64位,4 GB RAM,Core i3 @ 3.20GHz处理器。

我创建了两个表格。

DROP TABLE `myisam_upload_test`;
CREATE TABLE `myisam_upload_test` (
  `ID` INT(10) NOT NULL,
  `FIRST_NAME` VARCHAR(255) DEFAULT NULL,
  `LAST_NAME` VARCHAR(255) DEFAULT NULL,
  `TEAM` VARCHAR(20) DEFAULT NULL,
  DESIGNATION VARCHAR(50) DEFAULT NULL,
  `COMPANY` VARCHAR(50) DEFAULT NULL,
  ADDRESS_LINE_1 VARCHAR(50) DEFAULT NULL,
  ADDRESS_LINE_2 VARCHAR(50) DEFAULT NULL,
  CITY VARCHAR(50) DEFAULT NULL,
  POST_CODE INT(5) DEFAULT NULL,
  STATE VARCHAR(50) DEFAULT NULL,
  COUNTRY VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MYISAM DEFAULT CHARSET=latin1;


DROP TABLE `innodb_upload_test`;
 CREATE TABLE `innodb_upload_test` (
  `ID` INT(10) NOT NULL,
  `FIRST_NAME` VARCHAR(255) DEFAULT NULL,
  `LAST_NAME` VARCHAR(255) DEFAULT NULL,
  `TEAM` VARCHAR(20) DEFAULT NULL,
  DESIGNATION VARCHAR(50) DEFAULT NULL,
  `COMPANY` VARCHAR(50) DEFAULT NULL,
  ADDRESS_LINE_1 VARCHAR(50) DEFAULT NULL,
  ADDRESS_LINE_2 VARCHAR(50) DEFAULT NULL,
  CITY VARCHAR(50) DEFAULT NULL,
  POST_CODE INT(5) DEFAULT NULL,
  STATE VARCHAR(50) DEFAULT NULL,
  COUNTRY VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=latin1;

我创建了一个150 MB的csv文件,并在两个表中上传。以下是结果。

InnoDB: 
Execution Time : 15.077 sec
Transfer Time  : 0 sec
Total Time     : 15.077 sec

MyISAM
Execution Time : 4.139 sec
Transfer Time  : 0 sec
Total Time     : 4.139 sec

MyISAM几乎比InnoDB快4倍,这在我们工作的环境中是不可接受的,正如我之前提到的那样,每一秒都值得我们使用。

以下是我的my.cnf文件

[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306

default-storage-engine=INNODB

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

max_connections=160

table_cache=320

query_cache_size=50M
query_cache_type=1
query_cache_limit=1M

tmp_table_size=33M

thread_cache_size=8

#*** MyISAM Specific options

myisam_max_sort_file_size=100G

myisam_sort_buffer_size=49M

key_buffer_size=45M

read_buffer_size=64K
read_rnd_buffer_size=256K

sort_buffer_size=256K


#*** INNODB Specific options ***
innodb_additional_mem_pool_size=25M

innodb_flush_log_at_trx_commit=2

innodb_log_buffer_size=64M

innodb_buffer_pool_size=3G

innodb_file_per_table=1

innodb_log_file_size=256M

innodb_thread_concurrency=10
innodb_read_io_threads=5
innodb_write_io_threads=5
innodb_use_sys_malloc=1

此外,我将innodb_flush_log_at_trx_commit更改为1& 2但结果是一样的。

此外,我尝试使用以下命令从InnoDB引擎中删除一些开销。

SET autocommit=0;
SET unique_checks=0;
SET FOREIGN_KEY_CHECKS=0;

如果我设置autocommit = 1,那么结果也是一样的。

Execution Time : 14.698 sec
Transfer Time  : 0 sec
Total Time     : 14.698 sec

我正在使用以下命令加载数据。

LOAD DATA LOCAL INFILE 'D:\\path\\Upload test.csv' 
INTO TABLE    test_db.innodb_upload_test FIELDS ESCAPED BY '\\' 
TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' 
(ID, FIRST_NAME, LAST_NAME, TEAM, DESIGNATION, COMPANY, ADDRESS_LINE_1, 
ADDRESS_LINE_2, CITY, POST_CODE);

请建议我如何使用InnoDB实现更快的csv上传。

0 个答案:

没有答案