15

私は、多くの変更を加えてしばらく稼働している MySQL データベースを持っています。最近、私はそれをよく見て、場合によっては同じフィールドのインデックスを 2 倍にしていることに気付きました。一部のインデックスが欠落しており、一般的に、すべてのインデックスが非常に混乱しています。

テーブルからすべてのインデックスを削除したい。後でALTER TABLE、関連するインデックスを実行して追加するスクリプトを準備しました。

テーブルからすべてのインデックスを削除する方法はありますか?

4

4 に答える 4

21

簡単なスクリプト:

-- 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`;
于 2016-05-17T14:28:31.650 に答える
15

phpmyadminまたは同様のツールを使用している場合は、グラフィカルに非常に簡単に実行できます。

または、すべてのインデックスに対して次のようなことを行います

ALTER TABLE  `table` DROP INDEX  `NameIndex`

でインデックスを取得できます

SHOW INDEX FROM `table`
于 2010-09-26T15:47:46.330 に答える
4

コマンドはありません。ただし、すべてのデータベースを表示し、データベース内のすべてのテーブルを表示し、それらのテーブル内のすべてのインデックスを表示し、それらをすべて削除するスクリプトを作成することはできます。しかし、あなたがいくつかの答えを受け入れ始めなければ、私はあなたのためにそれを書くつもりはありません。phpmyadminまたは別のグラフィカルツールを使用して、すべてのテーブルに対してこのきちんとした「すべてチェック」ボックスを選択することもできます。

于 2010-09-26T15:49:40.353 に答える