MySQL从表中删除所有索引

时间:2010-09-26 15:45:27

标签: mysql indexing alter-table

我有一个MySQL数据库,它运行了一段时间,并对其进行了很多更改。最近我查看它,我注意到在某些情况下,我在相同的字段上加倍了索引。缺少一些索引,并且通常所有索引都存在大量混乱。

我想从表中删除所有索引。稍后,我有一个准备好的脚本,它将运行ALTER TABLE并添加相关索引。

有没有办法从表中删除所有索引?

4 个答案:

答案 0 :(得分:15)

如果您有phpmyadmin或任何类似工具,您可以非常轻松地以图形方式执行此操作。

或者为每个索引执行类似

的操作
ALTER TABLE  `table` DROP INDEX  `NameIndex`

您可以使用

获取索引
SHOW INDEX FROM `table`

答案 1 :(得分:9)

简单的脚本:

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

答案 2 :(得分:5)

在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

答案 3 :(得分:4)

没有命令。 但是,您可以编写一个显示所有数据库的脚本,显示thowe数据库中的所有表,显示这些表中的所有索引并将它们全部删除。 但如果你不开始接受一些答案,我不会为你写的。 你也可以使用phpmyadmin或其他图形工具为每张桌子选择这个整洁的“全部检查”框。