2010-09-26 51 views
10

J'ai une base de données MySQL qui fonctionne depuis un certain temps maintenant avec beaucoup de changements. Dernièrement j'ai regardé dessus et j'ai remarqué que dans certains cas j'ai doublé l'index sur le même champ. Certains index sont manquants, et en général il y a un énorme désordre dans tous les index.MySQL supprimer tous les index de la table

Je souhaite supprimer tous les index d'une table. Plus tard, j'ai un script préparé qui va exécuter ALTER TABLE et ajouter les index pertinents.

Existe-t-il un moyen de supprimer tous les index d'une table?

Répondre

13

Si vous avez phpmyadmin ou un outil similaire, vous pouvez le faire très facilement graphiquement.

Ou pour tous les indices font quelque chose comme

ALTER TABLE `table` DROP INDEX `NameIndex` 

Vous pouvez obtenir les index avec

SHOW INDEX FROM `table` 
+0

Vous pouvez également déposer plus d'un index dans une requête, par exemple 'ALTER TABLE table DROP INDEX en premier, DROP INDEX en second lieu, DROP INDEX third' etc. – techouse

+1

Comment est-ce" très facile "dans phpMyAdmin? – User

4

pas une commande il ny a pas. vous pouvez cependant écrire un script qui montre toutes les bases de données, montre toutes les tables dans les bases de données, affiche tous les index à l'intérieur de ces tables et les supprime toutes. mais je ne vais pas écrire ça pour vous si vous ne commencez pas à accepter certaines réponses. vous pouvez également utiliser phpmyadmin ou un autre outil graphique pour sélectionner cette case "cocher tout" pour chaque table.

+0

d'abord merci pour la réponse. Deuxièmement, j'accepte les réponses car la réponse répond vraiment et donne une solution à la question. de toute façon je peux écrire le script moi-même mais merci pour l'offre. J'aimerais qu'il y ait un moyen de le faire (supprimer tous les index). – aviv

+0

okay ... c'est vrai. 54% juste regardé un peu peu pour moi mais si c'est comme ça c'est tout à fait correct. loic posté la commande pour lister les index, bonne chance avec votre script –

4

Dans Ruby on Rails Je fais ceci:

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 
7

Script simple:

-- 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`;