MySQL出口指数

时间:2010-06-29 11:24:41

标签: sql mysql export indexing extract

我确定之前一定有人问过,但我找不到它:

我有一个不断发展的CMS。我使用CMS构建了许多网站,因此它们存在许多数据库。

我想从开发数据库中提取索引并将它们应用于生产数据库。有没有一种简单的方法可以将索引提取为SQL?

有些事情:

create index idx1 on one (lft, rght);
create index idx1 on two (alias);
create index acos_idx3 on three (model, related_id);

3 个答案:

答案 0 :(得分:1)

我没有使用My SQL,但是我记得,备份是开放式文本DDL语句。似乎这意味着每个备份的开头将包含所有表,然后是所有索引。?

也许这个带有一些表循环的命令会让你想要:My SQL 5.0 Reference Manual

祝你好运!

答案 1 :(得分:1)

您可以从INFORMATION_SCHEMA数据库中提取索引,然后将它们添加到另一个数据库中,但这并不容易。

为了给您一个示例(来自用于部署的存储过程的代码),如果它尚不存在,则会添加一个唯一键:

if not exists (select * from information_schema.KEY_COLUMN_USAGE 
                where table_schema = 'database_name' 
                and table_name='your_table'
                and constraint_name ='key_name')
then
    alter table your_table add unique key `key_name` ('column_name');
end if;

您基本上可以在INFORMATION_SCHEMA中找到所需的任何内容。我相信你可以编写代码来动态检查所有这些索引,但我不确定它是否对你来说很容易。

<强>更新

您也可以使用show index from database.table,如MaasSql答案提供的链接所示。然后循环遍历结果并添加每个索引(如果它不在数据库中)。

或者你可以试试这个:

if not exists (select * from information_schema.STATISTICS
where table_schema = 'database_name' 
and table_name='table_name'
and index_name ='key_name')
then 
...
end if;

答案 2 :(得分:0)

好吧,我不得不转移到别的地方,这就是我得到的(就在Ceteras发布他的更新之前!)。目前的问题是CREATE INDEX IF NOT EXISTS无效,所以我需要找到另一种方法来做到这一点。可能会在本周末重新开始。

$query="SHOW TABLES";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
  $idxQ = "SHOW INDEXES FROM {$row[0]} IN $database;";
  $idxR = mysql_query($idxQ);

  while($idxRow = mysql_fetch_object($idxR))
  {
      //basic query: CREATE INDEX indexName ON tableName (columnName);
      $indexName = $idxRow->Key_name;
      if($indexName=='PRIMARY') continue;
      $tableName = $idxRow->Table;
      $columnName = $idxRow->Column_name;
      $idxCreateQ = "CREATE INDEX IF NOT EXISTS $indexName ON $tableName ($columnName);";
      echo $idxCreateQ;
  }

}