MySQL 删除表中的所有索引

发布于 2024-09-25 10:28:45 字数 173 浏览 1 评论 0原文

我有一个 MySQL 数据库,它已经运行了一段时间,其中有很多更改。最近我查看了它,发现在某些情况下我在同一字段上将索引加倍。有些索引丢失了,总体来说所有索引都混乱不堪。

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

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

I have a MySQL database that runs for some time now with many changes on it. Lately I looked over it and I noticed that in some cases I have doubled the index on the same field. Some Indexes are missing, and in general there is a huge mess in all the indexes.

I wants to drop all indexes from a table. Later on I have a prepared script that will run ALTER TABLE and add the relevant indexes.

Is there a way to drop all indexes from a table?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

痴情 2024-10-02 10:28:45

简单的脚本:

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

Simple script:

-- 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`;
我喜欢麦丽素 2024-10-02 10:28:45

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

或者对于每个索引执行类似的操作

ALTER TABLE  `table` DROP INDEX  `NameIndex`

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

SHOW INDEX FROM `table`

If you have phpmyadmin or any similar tool you can do that very easily graphically.

Or for every index do something like

ALTER TABLE  `table` DROP INDEX  `NameIndex`

You can get the indexes with

SHOW INDEX FROM `table`
锦爱 2024-10-02 10:28:45

在 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

In Ruby on Rails I do this:

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
娜些时光,永不杰束 2024-10-02 10:28:45

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

no there isnt a command.
you can however write a script that shows all databases, shows all tables inside thowe databases, shows all indexes inside those tables and drops them all.
but i'n not gonna write that for you if you don't start accepting some answers.
you can also use phpmyadmin or another graphical tool to select this neat "check all" box for every table.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文