在几百万条记录后,mysql插入索引表需要很长时间

san*_*uda 7 mysql myisam performance

我有一张这样的桌子

CREATE TABLE IF NOT EXISTS `dnddata` (
  `numbers` varchar(10) NOT NULL,
  `opstype` char(1) NOT NULL,
  PRIMARY KEY (`numbers`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
/*!50100 PARTITION BY KEY (numbers)
PARTITIONS 25 */;
Run Code Online (Sandbox Code Playgroud)

我必须插入 3 亿条记录。我每次使用load data in filecsv 文件插入 1000 万条记录。

第一次插入 1000 万条记录需要近 5 分钟。时间每一次都在逐渐增加。在 3000 万条记录后,它停止插入并且内存使用 100% 服务器没有响应。

在我的my.cnf文件设置下方

bulk_insert_buffer_size = 100M
key_buffer = 100M
sort_buffer_size = 50M
read_buffer = 50M
Run Code Online (Sandbox Code Playgroud)

我正在使用具有 2 G 内存的 CPU。

3000 万条记录的详细信息

    Space usage
Type    Usage
Data    545.3   MiB
Index   694.8   MiB
Total   1,240.1 MiB

MySQL client version: 5.5.14
Run Code Online (Sandbox Code Playgroud)

如果没有索引,它会在 50 秒内插入 1000 万个罚款。

请告诉我需要更改什么样的设置。

根据用户回答进行编辑

我已将 my.cnf 设置更改为以下

key_buffer_size = 1G
sort_buffer_size = 4M
read_buffer_size = 1M
read_rnd_buffer_size = 1M
join_buffer_size = 2M
bulk_insert_buffer_size = 32M
myisam_sort_buffer_size = 256M
Run Code Online (Sandbox Code Playgroud)

没用。问题没有解决。

我已经尝试过下面提到的方法来加载数据

set autocommit = 0; //for innodb
load data infile into …
COMMIT;

START TRANSACTION; 
load data infile into …
COMMIT;

ALTER TABLE dnddata DISABLE KEYS;
load data infile into …
ALTER TABLE dnddata ENABLE KEYS;
Run Code Online (Sandbox Code Playgroud)

没运气..

Mah*_*til 6

您应该分块加载这么大的文件以更快地加载数据,这里提到了加载大Load local data文件的问题以及如何解决它并使其更快的解决方案。

http://www.mysqlperformanceblog.com/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

  • MyISAM 表你应该按照以下步骤来加快加载数据:

通过一些额外的工作,LOAD DATA INFILE当表有许多索引时,可以使MyISAM 表的运行速度更快。

  1. 执行 FLUSH TABLES 语句或 mysqladmin flush-tables 命令。

  2. 使用 myisamchk --keys-used=0 -rq /path/to/db/tbl_name 删除表的所有索引使用。

  3. 使用 LOAD DATA INFILE 将数据插入到表中。这不会更新任何索引,因此速度非常快。

  4. 重新创建索引myisamchk -rq /path/to/db/tbl_name。这会在将索引树写入磁盘之前在内存中创建索引树,这比在 LOAD DATA INFILE 期间更新索引要快得多,因为它避免了大量的磁盘搜索。生成的索引树也是完美平衡的。

  5. 执行 FLUSH TABLES 语句或 mysqladmin flush-tables 命令。

如果您插入数据的 MyISAM 表为空,LOAD DATA INFILE 会自动执行上述优化。自动优化和显式使用过程之间的主要区别在于,您可以让 myisamchk 为索引创建分配比您希望服务器在执行 LOAD DATA INFILE 语句时为索引重新创建分配的临时内存多得多。

您还可以使用以下语句而不是 myisamchk 来禁用或启用 MyISAM 表的非唯一索引。如果使用这些语句,则可以跳过 FLUSH TABLE 操作:

ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅这些:

http://dev.mysql.com/doc/refman/5.5/en/optimizing-myisam-bulk-data-loading.html

https://wiki.rice.edu/confluence/display/~as43/Make+LOAD+DATA+INFILE+run+even+faster+for+a+MyISAM+table