2009-06-23 15 views
16

मैं वर्तमान में खंडित टेबल OPTIMIZE करना चाहता हूं। इन तालिकाओं में information_schema.DATA_FREE > 0 होना चाहिए।सभी खंडित तालिकाओं के लिए MySQL ऑप्टिमाइज़ टेबल

क्या एसक्यूएल में एक कमांड में इस संपत्ति के साथ सभी तालिकाओं को अनुकूलित करना संभव है या क्या मुझे ऐसा करने के लिए बाहरी कोड लिखना होगा?

उत्तर

36

आप कुछ इस तरह कर सकते हैं:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";") 
FROM tables 
WHERE DATA_FREE > 0 
INTO OUTFILE '/tmp/optimize.sql'; 
SOURCE '/tmp/optimize.sql'; 

वैकल्पिक रूप से, अगर पहले एक विफल रहता है, की कोशिश:

SELECT concat("OPTIMIZE TABLE ", table_schema,".",table_name,";") 
FROM information_schema.tables 
WHERE DATA_FREE > 0 
INTO OUTFILE '/tmp/optimize.sql'; 
SOURCE /tmp/optimize.sql; 
+9

थोड़ा सा मेरे लिए काम करने के लिए आवश्यक परिवर्तन है, लेकिन महान दृष्टिकोण। चयन करें ("ऑप्टिमाइज़ टेबल", table_schema, "।", Table_name, ";") info_schema.tables से जहां DATA_FREE> 0 INTOLE '/tmp/optimize.sql' में चयन करें; SOURCE /tmp/optimize.sql; –

+0

आपको table_schema और table_name के आस-पास कुछ बैकटिक्स बिल्ली-एड की आवश्यकता है, अन्यथा मैं आपको एक बियर देना चाहता हूं, बहुत धन्यवाद। –

1

ठीक है, यह एक पुरानी पोस्ट है, लेकिन यह जरूरी है।

फिल Dufault http://www.dufault.info/blog/a-script-to-optimize-fragmented-tables-in-mysql/ एक wonderfull स्क्रिप्ट लिखी है, कि GitHub पर है: https://github.com/pdufault/mysqlfragfinder/blob/master/mysqlfragfinder.sh

vim mysqlfragfinder.sh 
#copy paste from github 
chmod +x ./mysqlfragfinder.sh 
./mysqlfragfinder.sh --user root_username --password root_password 

और कहा कि सभी है। इसे थोड़ी देर के लिए कई सर्वरों पर उपयोग कर रहा है।

0

मुझे पता है कि एक जवाब है।

यह सूचकांक स्कैन की गति बढ़ा सकता है अगर आप समय-समय पर एक "अशक्त" ALTER टेबल ऑपरेशन है, जो तालिका के पुनर्निर्माण के लिए MySQL का कारण बनता है प्रदर्शन:

ALTER TABLE tbl_name ENGINE=INNODB

लेकिन MySQL InnoDB डीबी के लिए इस सिफारिश है

यहाँ मिले http://dev.mysql.com/doc/refman/5.0/en/innodb-file-defragmenting.html

संबंधित मुद्दे