सभी तालिकाएँ MySQL ऑप्टिमाइज़ करें?


245

MySQL में एक OPTIMIZE TABLE कमांड है जिसका उपयोग MySQL इंस्टॉल में अप्रयुक्त स्थान को पुनः प्राप्त करने के लिए किया जा सकता है। डेटाबेस और / या सर्वर स्थापित में हर तालिका के लिए इस अनुकूलन को चलाने के लिए एक तरीका (अंतर्निहित कमांड या सामान्य संग्रहित प्रक्रिया) है, या यह कुछ है जिसे आपको खुद को स्क्रिप्ट करना होगा?


11
इस बात से सावधान रहें कि यह जरूरी नहीं कि अंतरिक्ष को पुनः प्राप्त करे। यदि आप प्रति फ़ाइल अलग-अलग फ़ाइलों के बजाय एक फ़ाइल (शायद इन दिनों सबसे आम सेटअप) के साथ InnoDB का उपयोग कर रहे हैं, तो आप अभी भी अंत में डिस्क स्थान की समान मात्रा का उपयोग करेंगे। वास्तव में मैंने देखा है कि यह वास्तव में काफी अधिक डिस्क स्थान का उपयोग करता है जब सभी कहा और किया गया था। बड़ी तालिकाओं के साथ, तालिका को बहुत लंबे समय के लिए भी लॉक किया जा सकता है।
jmichalicek

1
OPTIMIZE TABLEMyISAM के लिए उपयोगी था। अब जब वह इंजन दूर जा रहा है, तो आवश्यकता OPTIMIZE TABLEदूर हो रही है, विशेष रूप से समय-समय पर सभी तालिकाओं को अनुकूलित करने की आवश्यकता है।
रिक जेम्स

+1 अच्छी जानकारी के लिए रिक - लेकिन मानक वास्तविक विश्व डेटाबेस प्रथाओं को देखते हुए, मुझे आश्चर्य नहीं होगा कि पुराने MyISAM तालिकाओं के आसपास एक और दशक तक बने रहेंगे
एलन स्टॉर्म

जवाबों:


410

आप mysqlcheckकमांड लाइन पर ऐसा करने के लिए उपयोग कर सकते हैं ।

एक डेटाबेस:

mysqlcheck -o <db_schema_name>

सभी डेटाबेस:

mysqlcheck -o --all-databases

क्या आप इस आदेश को महीने में कम से कम एक बार चलाने के लिए निर्धारित करने की अनुशंसा करेंगे?
गइया

11
हाय @ गइया। जरुरी नहीं। दिए गए शेड्यूल पर सभी तालिकाओं का अनुकूलन करना सभी के लिए फायदेमंद नहीं है। इस पोस्ट पर एक नज़र डालें और इस विषय पर बहुत अधिक गहराई से विचार के लिए टिप्पणियों को पढ़ें इससे मैं यहां सीमित स्थान प्रदान कर सकता हूं: xaprb.com/blog/2010/02/07/…
Ike Walker

18
सरल उपयोग:mysqlcheck -u [username] -p[password] -o [database name]
एम रोस्तमी

38
कृपया सलाह दी जाए कि OPTIMIZE के प्रदर्शन के दौरान तालिकाओं को बंद कर दिया जाए , जो तालिकाओं के बहुत सारे डेटा को रखने में पर्याप्त समय ले सकती हैं। इसलिए, उस समय के दौरान एक तालिका ऑप्टिमाइज़ की जा रही है, कोई नया रिकॉर्ड डाला या हटाया नहीं जा सकता है। आम तौर पर, एक उत्पादन प्रणाली के सभी तालिकाओं को ऑप्टिमाइज़ करना एक तुच्छ ऑपरेशन के रूप में नहीं माना जा सकता है।
वर्नर

2
@ नहीं-चिप आप OPTIMIZE TABLEकमांड का उपयोग करके MySQL क्लाइंट में तालिकाओं को अनुकूलित कर सकते हैं : dev.mysql.com/doc/refman/5.5/en/optimize-table.html । उदाहरण के लिए, एक तालिका को इस तरह से ऑप्टिमाइज़ करें: OPTIMIZE TABLE <your_schema>.<your_table>;दिए गए स्कीमा में सभी तालिकाओं को इस तरह से ऑप्टिमाइज़ करें:select concat('OPTIMIZE NO_WRITE_TO_BINLOG TABLE ',table_schema,'.',table_name,';') into outfile '/tmp/optimize_all_tables.sql' from information_schema.tables where table_schema = 'pabeta' and table_type = 'base table'; source /tmp/optimize_all_tables.sql;
Ike वाकर

28

मैंने इसे 'सरल' स्क्रिप्ट बनाया:

set @tables_like = null;
set @optimize = null;
set @show_tables = concat("show tables where", ifnull(concat(" `Tables_in_", database(), "` like '", @tables_like, "' and"), ''), " (@optimize:=concat_ws(',',@optimize,`Tables_in_", database() ,"`))");

Prepare `bd` from @show_tables;
EXECUTE `bd`;
DEALLOCATE PREPARE `bd`;

set @optimize := concat('optimize table ', @optimize);
PREPARE `sql` FROM @optimize;
EXECUTE `sql`;
DEALLOCATE PREPARE `sql`;

set @show_tables = null, @optimize = null, @tables_like = null;

इसे चलाने के लिए, बस इसे अपने डेटाबेस से जुड़े किसी भी SQL IDE में पेस्ट करें।

सूचना: यह कोड phpmyadmin पर काम नहीं करता है।

यह काम किस प्रकार करता है

यह एक show tablesस्टेटमेंट चलाता है और इसे तैयार स्टेटमेंट में स्टोर करता है। फिर यह optimize tableचयनित सेट में चलता है ।

आप किस तालिका में भिन्न मान सेट करके ऑप्टिमाइज़ कर सकते हैं @tables_like(जैसे :) set @tables_like = '%test%';


4
मेरे साझा होस्टिंग वातावरण में 'mysqlchk' उपलब्ध नहीं है इसलिए मैं इसे 'mysql' टर्मिनल सत्र से सीधे चला सकता हूं। धन्यवाद!
दिसंबर को funwhilelost

आपका स्वागत है। मैं इस कोड का उपयोग 50 डेटाबेस को ऑप्टिमाइज़ करने और यथासंभव न्यूनतम समय बिताने के लिए करता हूं। यदि आपको लगता है कि मैं किसी भी तरह से कोड में सुधार कर सकता हूं, तो आगे बढ़ें और मुझे अपने सुझाव दें। मुझे इस कीमती कोड को सुधारने में खुशी होगी।
इस्माइल मिगुएल

bd@ बी त्रुटि कोड: 1064 से तैयार करें । आपके SQL सिंटैक्स में एक त्रुटि है; लाइन 1 पर 'NULL' के पास उपयोग करने के लिए सही सिंटैक्स के लिए आपके MySQL सर्वर संस्करण से मेल खाती पुस्तिका को चेक करें
पॉल ग्रेगोइरे

@IsmaelMiguel यह MySQL है, आपका जवाब TSQL सिंटैक्स का उपयोग करता है और MySQL के साथ काम नहीं करेगा।
फरान्सी

2
@LorenzoBelfanti इसकी पुष्टि करने के लिए धन्यवाद। मुझे खुशी है कि 2 साल बाद भी, यह कोड कम से कम, 10 व्यक्तियों के लिए उपयोगी है। यह मेरे लिए बहुत बड़ी जीत है! एक बार फिर आपका धन्यवाद!
इस्माइल मिगुएल

20

उदाहरण के बाद php स्क्रिप्ट आपके डेटाबेस में सभी तालिकाओं को अनुकूलित करने में आपकी मदद कर सकता है

<?php

dbConnect();

$alltables = mysql_query("SHOW TABLES");

while ($table = mysql_fetch_assoc($alltables))
{
   foreach ($table as $db => $tablename)
   {
       mysql_query("OPTIMIZE TABLE '".$tablename."'")
       or die(mysql_error());

   }
}

?>

7
200 तालिकाओं वाले डेटाबेस पर आप एक बार में 1 तालिका के अनुकूलन के लिए 200 अलग-अलग क्वेरीज़ चलाने जा रहे हैं। आपको तालिका नामों को एक स्ट्रिंग में निहित करना चाहिए और इसलिए केवल एक अनुकूलन तालिका क्वेरी की आवश्यकता है।
डीन मार्शल

8
मुझे आश्चर्य है कि यदि अलग क्वेरी दृष्टिकोण कभी-कभी बेहतर होता है। MySQL का कहना है कि OPTIMIZE TABLE चलने के दौरान टेबल लॉक हैं। तब सर्वर को कम से कम समय के लिए ताले को प्राप्त करने के लिए एक समय में प्रत्येक को अनुकूलित करना समझदारी भरा प्रतीत होगा। जाहिर है कि एक सर्वर के लिए जो एक्सेस किया गया है। यदि नहीं, तो मुझे लगता है कि एक एकल क्वेरी सबसे अच्छा तरीका है।
बजे

यदि आप 1 क्वेरी में फंसे और बनाये गए तो स्क्रिप्ट क्या दिखेगी? धन्यवाद।
एच। फेरेंस

8
@ डीन एक लाइव एप्लिकेशन के लिए श्वास कक्ष देने के लिए अलग क्वेरी दृष्टिकोण अक्सर बेहतर होता है। वास्तव में, मैं आमतौर पर उस उद्देश्य के लिए देरी (सिर्फ 750ms या तो) जोड़ देता हूं।
zanlok

15

एक सरल शेल स्क्रिप्ट के साथ सभी डेटाबेस में सभी तालिकाओं को ठीक करने के लिए सभी आवश्यक प्रक्रियाएं करें:

#!/bin/bash
mysqlcheck --all-databases
mysqlcheck --all-databases -o
mysqlcheck --all-databases --auto-repair
mysqlcheck --all-databases --analyze

11

सभी डेटाबेस के लिए:

mysqlcheck -Aos -uuser -p 

एक डेटाबेस अनुकूलन के लिए:

mysqlcheck -os -uroot -p dbtest3

कम से कम मेरे लिए, लिनक्स के तहत, कमांड mysqlcheck -Aosको उपयोगकर्ता + पासवर्ड की आवश्यकता नहीं है।
15

7

PhpMyAdmin और अन्य स्रोतों से जिनका आप उपयोग कर सकते हैं:

SET SESSION group_concat_max_len = 99999999;
SELECT GROUP_CONCAT(concat('OPTIMIZE TABLE `', table_name, '`;') SEPARATOR '') AS O
FROM INFORMATION_SCHEMA.TABLES WHERE 
TABLE_TYPE = 'BASE TABLE'
AND table_name!='dual'
AND TABLE_SCHEMA = '<your databasename>'

फिर आप परिणाम को एक नई क्वेरी से कॉपी या पेस्ट कर सकते हैं या अपने स्वयं के स्रोत से निष्पादित कर सकते हैं। यदि आप पूरा विवरण नहीं देखते हैं: phpmyadmin में संपूर्ण विवरण देखने का तरीका


यह एक अच्छा जवाब था, लेकिन मेरे phpmyadmin पूरे आदेश को नहीं दिखाते हैं, बस पहले वाले फिर ... मेरे लिए दुख की बात है, योग्य।
मोननेरेट्रज

6

यदि आप अपने MySQL सर्वर में सभी डेटाबेस में सभी तालिकाओं का विश्लेषण, मरम्मत और अनुकूलन करना चाहते हैं, तो आप कमांड लाइन से एक बार में कर सकते हैं। हालांकि ऐसा करने के लिए आपको रूट की आवश्यकता होगी।

mysqlcheck -u root -p --auto-repair --optimize --all-databases

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

उदाहरण आउटपुट:

yourdbname1.yourdbtable1       OK
yourdbname2.yourdbtable2       Table is already up to date
yourdbname3.yourdbtable3
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

etc..
etc...

Repairing tables
yourdbname10.yourdbtable10
warning  : Number of rows changed from 121378 to 81562
status   : OK

यदि आप रूट पासवर्ड नहीं जानते हैं और WHM का उपयोग कर रहे हैं, तो आप इसे WHM के भीतर से बदलकर घर पर जा सकते हैं: घर> SQL सेवाएँ> अतिरिक्त SQL रूट पासवर्ड


5

कमांड लाइन से:

mysqlcheck -o <db_name> -u<username> -p

फिर पासवर्ड टाइप करें


4

आप mysql क्लाइंट का उपयोग करके डेटाबेस के सभी तालिकाओं को अनुकूलित / जांच और मरम्मत कर सकते हैं।

सबसे पहले, आपको सभी तालिकाओं की सूची मिलनी चाहिए, जिन्हें ',' से अलग किया गया है:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'show tables' [DB_NAME]|xargs|perl -pe 's/ /,/g'

अब, जब आपके पास अनुकूलन के लिए सभी तालिकाओं की सूची है:

mysql -u[USERNAME] -p[PASSWORD] -Bse 'optimize tables [tables list]' [DB_NAME]

3

MySQL Administrator(MySQL जीयूआई उपकरण का हिस्सा) एक डेटाबेस स्तर पर कर सकते हैं कि आप के लिए।

बस अपना स्कीमा चुनें और दबाएं Maintenance नीचे दाएं कोने में बटन ।

चूंकि जीयूआई उपकरण एंड-ऑफ-लाइफ स्थिति तक पहुंच चुके हैं, इसलिए उन्हें mysql पेज पर ढूंढना मुश्किल है। उन्हें Google के माध्यम से मिला: http://dev.mysql.com/downloads/gui-tools/5.0.html

मुझे नहीं पता कि नया MySQL वर्कबेंच भी ऐसा कर सकता है या नहीं।

और आप mysqlcheckकमांड लाइन टूल का उपयोग कर सकते हैं जो कि ऐसा करने में सक्षम होना चाहिए।


2

यदि आप सीधे डेटाबेस तक पहुँच रहे हैं तो आप निम्नलिखित प्रश्न लिख सकते हैं:

OPTIMIZE TABLE table1,table2,table3,table4......;

1

यह बैश स्क्रिप्ट रूट पासवर्ड को विकल्प के रूप में स्वीकार करेगी और स्थिति आउटपुट के साथ इसे एक-एक करके अनुकूलित करेगी:

#!/bin/bash

if [ -z "$1" ] ; then
  echo
  echo "ERROR: root password Parameter missing."
  exit
fi
MYSQL_USER=root
MYSQL_PASS=$1
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
TBLLIST=""
COMMA=""
SQL="SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE"
SQL="${SQL} table_schema NOT IN ('information_schema','mysql','performance_schema')"
for DBTB in `mysql ${MYSQL_CONN} -ANe"${SQL}"`
do
    echo OPTIMIZE TABLE "${DBTB};"
    SQL="OPTIMIZE TABLE ${DBTB};"
    mysql ${MYSQL_CONN} -ANe"${SQL}"
done

1

एक स्टार्टर बैश स्क्रिप्ट को डीबी के खिलाफ एक उपकरण को सूचीबद्ध करने और चलाने के लिए ...

#!/bin/bash

declare -a dbs
unset opt

for each in $(echo "show databases;" | mysql -u root) ;do

        dbs+=($each)

done



echo " The system found [ ${#dbs[@]} ] databases." ;sleep 2
echo
echo "press 1 to run a check"
echo "press 2 to run an optimization"
echo "press 3 to run a repair"
echo "press 4 to run check,repair, and optimization"
echo "press q to quit"
read input

case $input in
        1) opt="-c"
        ;;
        2) opt="-o"
        ;;
        3) opt="-r"
        ;;
        4) opt="--auto-repair -c -o"
        ;;
        *) echo "Quitting Application .."; exit 7
        ;;
esac

[[ -z $opt ]] && exit 7;

echo " running option:  mysqlcheck $opt in 5 seconds  on all Dbs... "; sleep 5

for ((i=0; i<${#dbs[@]}; i++)) ;do
        echo "${dbs[$i]} : "
        mysqlcheck $opt ${dbs[$i]}  -u root
    done

0

मेरी 2 सेंट: उच्चतम विखंडन के साथ तालिका के साथ शुरू करें

for table in `mysql -sss -e "select concat(table_schema,".",table_name) from information_schema.tables where table_schema not in ('mysql','information_schema','performance_schema') order by data_free desc;"
do
mysql -e "OPTIMIZE TABLE $table;"
done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.