15

我有一个 MySQL 数据库,现在运行了一段时间,上面有很多变化。最近我查看了它,我注意到在某些情况下我将同一字段的索引翻了一番。缺少一些索引,通常所有索引中都存在巨大的混乱。

我想从表中删除所有索引。稍后我有一个准备好的脚本,它将运行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 回答
7

在 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
于 2013-04-24T19:39:42.940 回答
4

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

于 2010-09-26T15:49:40.353 回答