2010-09-26 5 views
10

मेरे पास एक MySQL डेटाबेस है जो अब कुछ बदलावों के साथ चलता है। हाल ही में मैंने इसे देखा और मैंने देखा कि कुछ मामलों में मैंने उसी क्षेत्र में सूचकांक को दोगुना कर दिया है। कुछ इंडेक्स गायब हैं, और आम तौर पर सभी इंडेक्स में एक बड़ी गड़बड़ है।MySQL तालिका से सभी अनुक्रमणिका को छोड़कर

मैं सभी इंडेक्स को एक टेबल से छोड़ना चाहता हूं। बाद में मेरे पास एक तैयार स्क्रिप्ट है जो ALTER TABLE चलाएगी और प्रासंगिक अनुक्रमणिका जोड़ देगा।

क्या किसी तालिका से सभी अनुक्रमणिका को छोड़ने का कोई तरीका है?

उत्तर

13

यदि आपके पास phpmyadmin या कोई समान टूल है तो आप इसे आसानी से ग्राफिक रूप से कर सकते हैं।

या हर सूचकांक के लिए की तरह

ALTER TABLE `table` DROP INDEX `NameIndex` 

कुछ आपके पास कोई वहाँ नहीं है एक कमांड

SHOW INDEX FROM `table` 
+0

तुम भी एक क्वेरी, उदा में एक से अधिक सूचकांक ड्रॉप कर सकते हैं 'पहले तालिका तालिका ड्रोप इंडेक्स पहले, ड्रोप इंडेक्स दूसरा, ड्रॉप इंडेक्स तीसरा' आदि .. – techouse

+1

phpMyAdmin में यह "बहुत आसान" कैसा है? उत्तर के लिए – User

4

साथ अनुक्रमित मिल सकता है। हालांकि आप एक स्क्रिप्ट लिख सकते हैं जो सभी डेटाबेस दिखाता है, थॉवे डेटाबेस के अंदर सभी टेबल दिखाता है, उन तालिकाओं के अंदर सभी इंडेक्स दिखाता है और उन सभी को छोड़ देता है। लेकिन अगर आप कुछ उत्तरों को स्वीकार करना शुरू नहीं करते हैं तो मैं आपके लिए यह नहीं लिखूंगा। आप प्रत्येक तालिका के लिए इस साफ "सभी को चेक करें" बॉक्स का चयन करने के लिए phpmyadmin या अन्य ग्राफिकल टूल का भी उपयोग कर सकते हैं।

+0

पहला धन्यवाद। दूसरा मैं उत्तर स्वीकार कर रहा हूं क्योंकि उत्तर वास्तव में उत्तर देता है और प्रश्न के समाधान देता है। किसी भी तरह से मैं खुद स्क्रिप्ट लिख सकता हूं लेकिन पेशकश के लिए धन्यवाद। इच्छा है कि ऐसा करने का कोई तरीका होगा हालांकि (सभी इंडेक्स छोड़ना)। – aviv

+0

ठीक है ... ठीक है। 54% ने मुझे थोड़ा सा देखा लेकिन अगर ऐसा है तो यह पूरी तरह से ठीक है। loic ने लिपि इंडेक्स को सूचीबद्ध किया, आपकी स्क्रिप्ट के साथ शुभकामनाएं –

4

रूबी ऑन रेल्स में मैं यह कर:

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