首先,您的表定义在这里可能会有很大的差异。如果您不需要在列中使用NULL值,请定义它们为NOT NULL。这将节省索引空间,并且可以假定在创建时也会节省时间。

CREATE TABLE x (

i INTEGER UNSIGNED NOT NULL,

j INTEGER UNSIGNED NOT NULL,

nu DOUBLE NOT NULL,

A DOUBLE NOT NULL

);

关于创建索引所需的时间,这需要进行表扫描,并将显示为REPAIR BY SORTING。在您的情况下(即大规模数据集),创建一个具有所需索引的新表并将数据插入其中可能更快,因为这将避免REPAIR BY SORTING操作,而是按顺序在插入时构建索引。在这篇文章中解释了类似的概念。

CREATE DATABASE trans_clone;

CREATE TABLE trans_clone.trans LIKE originalDB.trans;

ALTER TABLE trans_clone.trans ADD KEY idx_A (A);

然后按照文章中的方法将插入操作分成多个块,或使用MYSQLDUMP导出数据:

mysqldump originalDB trans --extended-insert --skip-add-drop-table --no-create-db --no-create-info > originalDB .trans.sql

mysql trans_clone < originalDB .trans.sql

这将插入数据,但不需要重建索引(索引在每行插入时构建),并且应该完成得更快。