しばらくの間実行されているMySQLデータベースがあり、多くの変更が加えられています。最近それを調べたところ、同じフィールドのインデックスが2倍になっている場合があることに気づきました。一部のインデックスが欠落しており、一般に、すべてのインデックスに大きな混乱があります。
テーブルからすべてのインデックスを削除したい。後で、ALTER TABLE
を実行し、関連するインデックスを追加するスクリプトを用意しました。
テーブルからすべてのインデックスを削除する方法はありますか?
Phpmyadminまたは同様のツールをお持ちの場合は、グラフィカルに非常に簡単に行うことができます。
または、すべてのインデックスに対して次のようなことを行います
ALTER TABLE `table` DROP INDEX `NameIndex`
でインデックスを取得できます
SHOW INDEX FROM `table`
簡単なスクリプト:
-- 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`;
In 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
コマンドはありません。ただし、すべてのデータベースを表示し、データベース内のすべてのテーブルを表示し、それらのテーブル内のすべてのインデックスを表示し、それらをすべて削除するスクリプトを作成することはできます。しかし、あなたがいくつかの答えを受け入れ始めなければ、私はあなたのためにそれを書くつもりはありません。 phpmyadminまたは別のグラフィカルツールを使用して、すべてのテーブルに対してこのきちんとした「すべてチェック」ボックスを選択することもできます。