2010-09-26 17 views
10

Mam bazę danych MySQL, która działa od jakiegoś czasu i zawiera wiele zmian. Ostatnio obejrzałem go i zauważyłem, że w niektórych przypadkach podwoiłem indeks na tym samym polu. Brakuje niektórych indeksów, a ogólnie we wszystkich indeksach występuje ogromny bałagan.MySQL upuszczając wszystkie indeksy z tabeli

Chcę upuścić wszystkie indeksy z tabeli. Później mam przygotowany skrypt, który uruchomi się pod ALTER TABLE i doda odpowiednie indeksy.

Czy istnieje sposób na usunięcie wszystkich indeksów ze stołu?

Odpowiedz

13

Jeśli masz phpmyadmina lub podobne narzędzie, możesz to bardzo łatwo zrobić graficznie.

Albo dla każdego indeksu zrobić coś takiego

ALTER TABLE `table` DROP INDEX `NameIndex` 

można uzyskać indeksy z

SHOW INDEX FROM `table` 
+0

Można również spaść więcej niż jeden indeks w jednym zapytaniu, na przykład 'ALTER TABLE table DROP INDEX first, DROP INDEX second, DROP INDEX third' etc .. – techouse

+1

Jak to jest" bardzo łatwe "w phpMyAdmin? – User

4

nie ma zbyt polecenia. można jednak napisać skrypt, który pokazuje wszystkie bazy danych, pokazuje wszystkie tabele w bazach danych thowe, pokazuje wszystkie indeksy w tych tabelach i upuszcza je wszystkie. ale nie piszę tego dla ciebie, jeśli nie zaczniesz przyjmować niektórych odpowiedzi. można również użyć phpmyadmin lub innego narzędzia graficznego, aby wybrać to schludne pole "sprawdź wszystkie" dla każdej tabeli.

+0

pierwsze dzięki za odpowiedź. po drugie, akceptuję odpowiedzi, ponieważ odpowiedź naprawdę odpowiada i daje rozwiązanie tego pytania. w każdym razie mogę napisać scenariusz sam, ale dzięki za ofertę. żałuję, że nie byłoby sposobu, aby to zrobić (zrzucając wszystkie indeksy). – aviv

+0

w porządku ... to prawda. 54% po prostu wydawało mi się trochę za małe, ale jeśli tak jest, to całkowicie w porządku. loic wysłał polecenie, aby wyświetlić listę indeksów, powodzenia w twoim skrypcie –

4

W Ruby on Rails to zrobić:

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

Prosty skrypt:

-- 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`; 
Powiązane problemy