I need to create TEMPORARY
tables for processing (via JOIN
) a large set of data (1M rows), which have varchar
columns. If I use ENGINE=MEMORY
, it will change varchar
to char
. Then, the data will not fit into memory (even by increasing tmp_table_size
/max_heap_table_size
).
I understand that memory mapping need char
structure, but is there a workaround to create TEMPORARY
tables in MEMORY
using varchar
to minimise the memory usage?
This is my process:
CREATE TEMPORARY TABLE temp
(
ArticleID int(11) unsigned NOT NULL,
Tag varchar(255),
INDEX(Tag),
PRIMARY KEY(ArticleID,Tag)
) ENGINE=innoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci
LOAD DATA LOCAL INFILE 'file.csv' IGNORE INTO TABLE temp
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
(ArticleID,Tag);
// Adding missing tags in tag table
INSERT IGNORE INTO Tags (Tag) SELECT DISTINCT Tag FROM temp;
INSERT INTO TagMap (ArticleID,TagID)
SELECT a.ArticleID,b.TagID FROM temp a JOIN Tags b ON a.Tag=b.Tag;
In my experience, InnoDB
has a better performance as compared with Aria
and MyISAM
.