【问题标题】:Pass index to temporary table from regular table?将索引从常规表传递到临时表?
【发布时间】:2011-03-17 22:44:13
【问题描述】:

我正在使用这样的查询创建一个临时表:

CREATE TEMPORARY TABLE temp_table
SELECT * FROM regular_table
WHERE 1

但是 regular_table 在某些字段上有 FULLTEXT 索引。我尝试对新的临时表进行 FULLTEXT 搜索,但我收到一条错误消息,告诉我 “找不到与列列表匹配的 FULLTEXT 索引”。所以很明显索引没有复制到新表中。有没有办法强制这样做?

谢谢。

【问题讨论】:

    标签: mysql indexing temp-tables


    【解决方案1】:

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

    现在有一点小技巧了。您可以将磁盘上的物理文件复制到一个新名称,并复制包含索引的表,但我假设您是在应用程序中执行此操作,因此这可能不太实用。

    【讨论】:

    • 注意:这仅适用于 MyISAM(不适用于 InnoDB 或其他),并且可能需要 root 权限。
    【解决方案2】:

    你可以使用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 语句。

    【讨论】:

    • 谢谢!.. 这可能是一个小小的疏忽,但我相信您必须输入ALTER TABLE tablename 我收到了一个错误,只是ALTER tablename .. 感谢您提供信息!
    • @John Isaacks:不客气;感谢您的更正 - 已编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多