我正在使用如下查询创建临时表:
CREATE TEMPORARY TABLE temp_table
SELECT * FROM regular_table
WHERE 1
但是regular_table在某些字段上有FULLTEXT索引。我尝试在新的临时表上进行FULLTEXT搜索,并收到错误告诉我“找不到与列列表匹配的FULLTEXT索引”。因此,索引不会复制到新表。有没有办法强迫这个?
感谢。
答案 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)
临时表与任何其他表完全相同,只是它会在会话结束时删除。拥有相同索引(从数据库中)的唯一方法是在表上创建它们,就像在任何其他表中一样。
现在有一点黑客攻击。您可以将磁盘上的物理文件复制到一个新名称,并拥有包含索引的表的克隆,但我假设您在应用程序中执行此操作,这可能不太实用。