我正在使用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上传。