首先,您的表定义在这里可能会有很大的差异。如果您不需要在列中使用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
这将插入数据,但不需要重建索引(索引在每行插入时构建),并且应该完成得更快。