MySQL删除表中的所有索引

xxb16uws  于 2022-12-03  发布在  Mysql
关注(0)|答案(4)|浏览(237)

我有一个MySQL数据库,它已经运行了一段时间了,上面有很多变化。最近我检查了一下,我注意到在某些情况下,我在同一个字段上的索引增加了一倍。一些索引丢失了,总的来说,所有索引都很混乱。
我想删除表中的所有索引。稍后我有一个准备好的脚本,它将运行ALTER TABLE并添加相关索引。
是否有方法从表中删除所有索引?

6bc51xsx

6bc51xsx1#

简单脚本:

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

vmdwslir2#

如果你有phpmyadmin或任何类似的工具,你可以很容易地做到这一点的图形。
或者对每个索引执行如下操作

ALTER TABLE  `table` DROP INDEX  `NameIndex`

您可以使用以下命令获取索引

SHOW INDEX FROM `table`
cvxl0en2

cvxl0en23#

在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
wlsrxk51

wlsrxk514#

不,这里没有一个命令。你可以写一个脚本来显示所有的数据库,显示数据库中的所有表,显示这些表中的所有索引,并删除它们。但是如果你不接受一些答案,我就不为你写了。你也可以使用phpmyadmin或其他图形工具来为每个表选择这个整洁的“全选”框。

相关问题