代码之家  ›  专栏  ›  技术社区  ›  Richard

在不锁定数据库的情况下创建索引

  •  8
  • Richard  · 技术社区  · 14 年前

    我有一张1000多万行的桌子。我需要在一个列上创建一个索引,但是,创建索引需要很长时间,因此我得到了表的锁。

    更新:我想我应该提到这是一个经常写的表。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Daniel    11 年前

    MySQL NDBCLUSTER引擎可以在线创建索引,而无需锁定对表的写入。然而,应用最广泛的InnoDB引擎不支持此功能。另一个免费的开源dbpostgres支持“并发创建索引”。

        2
  •  2
  •   David Menard    14 年前

    可以使用以下方法(伪代码)防止阻塞:

    create table temp like my_table;
    update logger to log in temp;
    alter table my_table add index new_index;
    insert into my_table select * from temp;
    update logger to log in my_table;
    drop table temp
    

    其中logger将是在常规使用中向表中添加行/更新的内容(例如:php脚本)。这将设置一个临时表,以便在另一个表更新时使用。

        3
  •  0
  •   Confusion    14 年前

    之前 将插入记录。这样,索引也将在填充表的过程中被填充。尽管这需要更长的时间,但至少在rake任务完成后,它就可以开始了。