2010-09-26 349 views
10

我有一段時間運行的MySQL數據庫,其中有許多更改。最近我查看了一下,發現在某些情況下,我在同一個領域的指數翻了一番。一些索引缺失,並且通常在所有索引中都有很大的混亂。MySQL從表中刪除所有索引

我想刪除表中的所有索引。稍後,我有一個準備好的腳本,它將運行ALTER TABLE並添加相關索引。

有沒有辦法從表中刪除所有索引?

回答

13

如果你有phpmyadmin或任何類似的工具,你可以很容易地以圖形的方式做到這一點。

或每指數做類似

ALTER TABLE `table` DROP INDEX `NameIndex` 

您可以

SHOW INDEX FROM `table` 
+0

您也可以在一個查詢,例如跌幅超過一個索引'ALTER TABLE表DROP INDEX第一,DROP INDEX第二,DROP INDEX第三'等等。 – techouse 2015-09-02 19:33:23

+1

在phpMyAdmin中它是如何「非常容易」的? – User 2015-10-16 03:39:43

4

拿到指標無心不是一個命令。 然而,你可以編寫一個腳本來顯示所有的數據庫,顯示數據庫中的所有表,顯示這些表中的所有索引並全部刪除它們。 但我不會爲你寫,如果你不開始接受一些答案。 您也可以使用phpmyadmin或其他圖形工具爲每個表格選擇這個整齊的「全選」框。

+0

首先感謝您的回答。第二我接受答案,因爲答案真的回答並給出了問題的解決方案。無論如何,我可以自己寫腳本,但感謝提供。希望有一種方法可以這樣做(刪除所有索引)。 – aviv 2010-09-26 16:09:33

+0

好吧......多數民衆贊成在正確的。 54%對我來說看起來有點少,但如果它像這樣完全沒問題的話。 loic發佈了命令列出索引,祝你的腳本好運 – 2010-09-26 17:52:20

4

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

簡單腳本:

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