Индексы экспорта MySQL - PullRequest
       16

Индексы экспорта MySQL

0 голосов
/ 29 июня 2010

Я уверен, что это, должно быть, спрашивали раньше, но я не могу найти это:

У меня есть 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 ]

1 голос
/ 29 июня 2010

Вы можете извлечь индексы из базы данных 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. Я считаю, что вы можете написать код для динамической проверки всех этих индексов, но я не уверен, легко ли это для вас.

UPDATE:

Вы также можете использовать 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;
1 голос
/ 29 июня 2010

Я не очень много работаю с My SQL, но, насколько я помню, резервные копии были открытыми текстовыми инструкциями DDL.Похоже, это будет означать, что в начале каждой резервной копии будут содержаться все таблицы, а затем все индексы.Справочное руководство по My SQL 5.0 .

Удачи!

0 голосов
/ 06 июля 2010

Что ж, мне пришлось перейти на что-то другое, и это все, что я получил (как раз перед тем, как 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;
  }

}

...