从常规表传递索引到临时表?

时间:2010-07-19 14:15:37

标签: mysql indexing temp-tables

我正在使用如下查询创建临时表:

CREATE TEMPORARY TABLE temp_table
SELECT * FROM regular_table
WHERE 1

但是regular_table在某些字段上有FULLTEXT索引。我尝试在新的临时表上进行FULLTEXT搜索,并收到错误告诉我“找不到与列列表匹配的FULLTEXT索引”。因此,索引不会复制到新表。有没有办法强迫这个?

感谢。

2 个答案:

答案 0 :(得分:10)

您可以使用CREATE TEMPORARY TABLE temp_table LIKE regular_table,但这将创建所有索引,因此当您执行INSERT INTO temp_table SELECT * FROM regular_table时,将重建索引 - 这可能会很长。

或者,您可以创建表并在之后添加索引:

CREATE TEMPORARY TABLE temp_table
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz)
INSERT INTO temp_table SELECT * FROM regular_table

但是,每次插入时都会更新索引。

可能最有效的方法是创建临时表,然后插入所有,构建索引:

CREATE TEMPORARY TABLE temp_table
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz)
ALTER TABLE temp_table DISABLE KEYS
INSERT INTO temp_table SELECT * FROM regular_table
ALTER TABLE temp_table ENABLE KEYS

同样,您将不得不等待索引构建,除非它将在一个块中发生,使用最后一个ALTER语句。

答案 1 :(得分:2)

临时表与任何其他表完全相同,只是它会在会话结束时删除。拥有相同索引(从数据库中)的唯一方法是在表上创建它们,就像在任何其他表中一样。

现在有一点黑客攻击。您可以将磁盘上的物理文件复制到一个新名称,并拥有包含索引的表的克隆,但我假设您在应用程序中执行此操作,这可能不太实用。