2010-09-26 17 views
10

Tengo una base de datos MySQL que se ejecuta desde hace un tiempo con muchos cambios en ella. Últimamente lo revisé y noté que en algunos casos he doblado el índice en el mismo campo. Algunos Índices faltan, y en general hay un gran desorden en todos los índices.MySQL eliminando todos los índices de la tabla

Quiero eliminar todos los índices de una tabla. Más tarde tengo un script preparado que ejecutará ALTER TABLE y agregará los índices relevantes.

¿Hay alguna forma de eliminar todos los índices de una tabla?

Respuesta

13

Si tiene phpmyadmin o cualquier herramienta similar, puede hacerlo de forma muy sencilla.

O para cada índice de hacer algo como

ALTER TABLE `table` DROP INDEX `NameIndex` 

Usted puede obtener los índices con

SHOW INDEX FROM `table` 
+0

También puede caer más de un índice en una consulta, por ejemplo, 'ALTER TABLE table DROP INDEX first, DROP INDEX second, DROP INDEX third' etc. – techouse

+1

¿Cómo es" muy fácil "en phpMyAdmin? – User

4

sin Tampoco hay un comando. puede escribir un script que muestre todas las bases de datos, muestre todas las tablas dentro de las bases de datos, muestre todos los índices dentro de esas tablas y las descarte. pero no voy a escribir eso para ti si no comienzas a aceptar algunas respuestas. también puede usar phpmyadmin u otra herramienta gráfica para seleccionar este cuadro "verificar todo" ordenado para cada tabla.

+0

primero gracias por la respuesta. segundo, estoy aceptando respuestas ya que la respuesta realmente responde y da solución a la pregunta. de todos modos, puedo escribir el guión, pero gracias por ofrecerlo. desearía que hubiera una forma de hacerlo (dejando caer todos los índices). – aviv

+0

bien ... eso es correcto. El 54% me pareció un poco escaso, pero si es así, está totalmente bien. Loic publicó el comando para enumerar los índices, buena suerte con su script –

4

en Ruby on Rails hago esto:

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

guión 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`; 
Cuestiones relacionadas