MySQL отбрасывает все индексы из таблицы - PullRequest
13 голосов
/ 26 сентября 2010

У меня есть база данных MySQL, которая работает в течение некоторого времени со многими изменениями.В последнее время я просмотрел его и заметил, что в некоторых случаях я удваивал индекс в том же поле.Некоторые индексы отсутствуют, и, как правило, во всех индексах имеется большой беспорядок.

Я хочу удалить все индексы из таблицы.Позже у меня есть подготовленный скрипт, который будет запускать ALTER TABLE и добавлять соответствующие индексы.

Есть ли способ удалить все индексы из таблицы?

Ответы [ 4 ]

15 голосов
/ 26 сентября 2010

Если у вас есть phpmyadmin или любой другой подобный инструмент, вы можете сделать это очень легко графически.

Или для каждого индекса сделайте что-то вроде

ALTER TABLE  `table` DROP INDEX  `NameIndex`

Вы можете получить индексы с помощью

SHOW INDEX FROM `table`
12 голосов
/ 17 мая 2016

Простой скрипт:

-- list all non-unique indexes
SELECT table_name AS `Table`,
       index_name AS `Index`,
       GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics
WHERE NON_UNIQUE = 1 AND table_schema = 'mydatabase' AND table_name = 'mytable'
GROUP BY 1,2;

-- drop all non-unique indexes
SET SESSION group_concat_max_len=10240;

SELECT CONCAT('ALTER TABLE ', `Table`, ' DROP INDEX ', GROUP_CONCAT(`Index` SEPARATOR ', DROP INDEX '),';' )
FROM (
SELECT table_name AS `Table`,
       index_name AS `Index`
FROM information_schema.statistics
WHERE NON_UNIQUE = 1 AND table_schema = 'mydatabase' AND table_name = 'mytable'
GROUP BY `Table`, `Index`) AS tmp
GROUP BY `Table`;

-- add all non-unique indexes , WITHOUT index length spec
SET SESSION group_concat_max_len=10240;
SELECT CONCAT('ALTER TABLE ', `Table`, ' ADD INDEX ', GROUP_CONCAT(CONCAT(`Index`, '(', `Columns`, ')') SEPARATOR ',\n ADD INDEX ') )
FROM (
SELECT table_name AS `Table`,
       index_name AS `Index`,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics
WHERE NON_UNIQUE = 1 AND table_schema = 'mydatabase' AND table_name = 'mytable'
GROUP BY `Table`, `Index`) AS tmp
GROUP BY `Table`;
5 голосов
/ 24 апреля 2013

В Ruby on Rails я делаю это:

  indexes = ActiveRecord::Base.connection.execute("SHOW INDEX FROM tablename")
  indexes.each do |index|
    ActiveRecord::Base.connection.execute("ALTER TABLE tablename DROP INDEX #{index[2]};")
  end
4 голосов
/ 26 сентября 2010

нет, нет команды.однако вы можете написать скрипт, который показывает все базы данных, показывает все таблицы внутри баз данных, показывает все индексы внутри этих таблиц и удаляет их все.но я не собираюсь писать это для вас, если вы не начнете принимать некоторые ответы.Вы также можете использовать phpmyadmin или другой графический инструмент, чтобы установить этот аккуратный флажок «проверить все» для каждой таблицы.

...