মাইএসকিউএল সমস্ত টেবিল অপ্টিমাইজ করবেন?


245

মাইএসকিউএলে একটি অপ্টিমাইজ টেবিল কমান্ড রয়েছে যা একটি মাইএসকিউএল ইনস্টল-এ অব্যবহৃত স্থান পুনরায় দাবি করতে ব্যবহার করা যেতে পারে। ডাটাবেস এবং / অথবা সার্ভার ইনস্টল প্রতিটি টেবিলের জন্য এই অপ্টিমাইজেশন চালানোর জন্য কি কোনও উপায় (অন্তর্নির্মিত কমান্ড বা সাধারণ সঞ্চিত প্রক্রিয়া) আছে বা আপনি নিজেই স্ক্রিপ্ট করতে চান এটি এমন কি?


11
সাবধানতা অবলম্বন করুন যে এটি অগত্যা স্থানটি পুনরায় দাবি করবে না। আপনি যদি টেবিলের জন্য পৃথক ফাইলের পরিবর্তে কোনও একক ফাইল (সম্ভবত আজকাল সর্বাধিক সাধারণ সেটআপ) দিয়ে ইনোডিবি ব্যবহার করছেন তবে আপনি এখনও শেষে একই পরিমাণে ডিস্কের স্থান ব্যবহার করবেন। প্রকৃতপক্ষে আমি দেখেছি এটি আসলে উল্লেখযোগ্যভাবে আরও বেশি ডিস্ক স্পেস ব্যবহার করে যখন সমস্ত বলা হয়ে গিয়েছিল। বড় টেবিল সহ, টেবিলটি খুব দীর্ঘ সময়ের জন্যও লক হয়ে থাকতে পারে।
জেমিকালিকেক

1
OPTIMIZE TABLEমাইআইএসএএম এর জন্য কার্যকর ছিল। এখন যে ইঞ্জিনটি চলে যাচ্ছে, এর প্রয়োজনীয়তা OPTIMIZE TABLEচলে যাচ্ছে, বিশেষত সময়ে সময়ে সমস্ত টেবিলকে অপ্টিমাইজ করার প্রয়োজন।
রিক জেমস

ভাল তথ্য রিকের জন্য +1 - তবে মানক সত্যিকারের ওয়ার্ল্ড ডাটাবেস অনুশীলন দেওয়া হয়েছে, পুরানো মাইআইএসএএম টেবিলগুলি আরও এক দশক ধরে থাকলে
অ্যালান স্টর্ম

উত্তর:


410

আপনি mysqlcheckকমান্ড লাইনে এটি করতে ব্যবহার করতে পারেন ।

একটি ডাটাবেস:

mysqlcheck -o <db_schema_name>

সমস্ত ডাটাবেস:

mysqlcheck -o --all-databases

আপনি কি এই আদেশটি মাসে অন্তত একবার চালানোর জন্য নির্ধারিত হওয়ার পরামর্শ দিচ্ছেন?
গায়া

11
হাই @ গাইয়া অগত্যা। প্রদত্ত সময়সূচীতে সমস্ত সারণী অনুকূলিত করা প্রত্যেকের পক্ষে উপকারী নয়। এই পোস্টটি একবার দেখুন এবং আমি এখানে সীমাবদ্ধ স্থান সরবরাহ করতে পারি তার চেয়ে এই বিষয়ে গভীরতর চিন্তাভাবনার জন্য মন্তব্যগুলি পড়ুন: xaprb.com/blog/2010/02/07/…
আইকে ওয়াকার

18
সাধারণ ব্যবহার:mysqlcheck -u [username] -p[password] -o [database name]
এম রোস্তামি

38
দয়া করে পরামর্শ দিন যে টেবিলগুলি লক করা আছে অপ্টিমাইজ করার সময়, যদি টেবিলগুলিতে প্রচুর ডেটা থাকে তবে এটি যথেষ্ট পরিমাণ সময় নিতে পারে। সুতরাং, কোনও সারণী অপ্টিমাইজড হওয়ার সময়, কোনও নতুন রেকর্ড সন্নিবেশ করা বা মোছা যাবে না। সাধারণত, একটি উত্পাদন সিস্টেমের সমস্ত সারণী অপ্টিমাইজ করা তুচ্ছ ক্রিয়াকলাপ হিসাবে বিবেচনা করা যায় না।
ওয়ার্নার

2
@ নো-চিপ, আপনি OPTIMIZE TABLEকমান্ডটি ব্যবহার করে মাইএসকিউএল ক্লায়েন্টে টেবিলগুলি অনুকূল করতে পারেন : 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;
আইকে ওয়াকার

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;

এটি চালানোর জন্য, কেবল এটি আপনার ডাটাবেসের সাথে সংযুক্ত যে কোনও এসকিউএল আইডিইতে পেস্ট করুন।

বিজ্ঞপ্তি: এই কোডটি phpmyadmin এ কাজ করবে না

কিভাবে এটা কাজ করে

এটি একটি show tablesবিবৃতি চালায় এবং এটি একটি প্রস্তুত বিবৃতিতে সঞ্চয় করে। তারপরে এটি optimize tableনির্বাচিত সেটে একটি চালায় ।

ভারে @tables_like(যেমন set @tables_like = '%test%';:) আলাদা মান নির্ধারণ করে কোন টেবিলগুলি অনুকূল করতে হবে তা আপনি নিয়ন্ত্রণ করতে পারেন ।


4
আমার ভাগ করা হোস্টিং পরিবেশে 'মাইএসকিএলচ্ক' উপলব্ধ নেই তাই আমি এটি সরাসরি 'মাইএসকিএল' টার্মিনাল সেশন থেকে চালাতে পারি। ধন্যবাদ!
ফানথলস্ট

আপনি স্বাগত জানাই। আমি 50 টি ডাটাবেস অপ্টিমাইজ করতে এবং যথাসম্ভব সর্বনিম্ন সময় ব্যয় করতে এই কোডটি ব্যবহার করি। আপনি যদি ভাবেন যে আমি কোনওভাবে কোডটি উন্নত করতে পারি তবে এগিয়ে যান এবং আমাকে আপনার পরামর্শ দিন। আমি এই মূল্যবান কোডটি উন্নত করতে পেরে খুশি হব।
ইসমাইল মিগুয়েল

bd@ বি ত্রুটি কোড থেকে প্রস্তুত করুন : 1064. আপনার এসকিউএল সিন্টেক্সে আপনার একটি ত্রুটি রয়েছে; 1 ম লাইনে 'NULL' এর নিকটবর্তী সঠিক সিনট্যাক্সের জন্য আপনার মাইএসকিউএল সার্ভার সংস্করণের সাথে সম্পর্কিত ম্যানুয়ালটি পরীক্ষা করুন
পল গ্রেগোয়ার

@ ইসমাইলমিগুয়েল এটি মাইএসকিউএল, আপনার উত্তর টিএসকিউএল সিনট্যাক্স ব্যবহার করে এবং মাইএসকিউএল নিয়ে কাজ করবে না।
ফ্রেঞ্চিস

2
@ লরেঞ্জোবেলফান্তি এটি নিশ্চিত করার জন্য আপনাকে ধন্যবাদ। আমি চটজলদি, এমনকি 2 বছর পরেও, এই কোডটি কমপক্ষে, 10 ব্যক্তির পক্ষে কার্যকর। এটা আমার জন্য বিশাল জয়! আবার আপনাকে ধন্যবাদ!
ইসমাইল মিগুয়েল

20

উদাহরণস্বরূপ পিএইচপি স্ক্রিপ্ট আপনাকে আপনার ডাটাবেসের সমস্ত সারণী অনুকূল করতে সহায়তা করতে পারে

<?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
আমি বিস্মিত হই যদি আলাদা জিজ্ঞাসা পদ্ধতির মাঝে মাঝে আরও ভাল হয়। মাইএসকিউএল বলছে অপটিমিজ টেবিল চলাকালীন টেবিলগুলি লক হয়ে গেছে। তারপরে সার্ভারকে ন্যূনতম সময়ের জন্য লকগুলি অর্জন করতে এক সাথে প্রত্যেককে অপ্টিমাইজ করা বুদ্ধিমান বলে মনে হয়। স্পষ্টতই এটি এমন একটি সার্ভারের জন্য যা অ্যাক্সেস করে রাখে। যদি তা না হয় তবে আমি মনে করি একটি একক ক্যোয়ারী সেরা পদ্ধতির জারি করে।
glarrain

স্ক্রিপ্টটি দেখতে কেমন হবে যদি আপনি অন্তর্ভুক্ত হন এবং 1 টি কোয়েরিতে তৈরি করেন? ধন্যবাদ।
এইচ। ফেরেন্স

8
@ ডিয়ান পৃথক ক্যোয়ারী পদ্ধতির লাইভ অ্যাপ্লিকেশনটির জন্য শ্বাসকষ্ট দেওয়ার জন্য প্রায়শই ভাল। আসলে, আমি সাধারণত ঠিক সেই উদ্দেশ্যে একটি বিলম্ব (মাত্র 750 মিমি বা তাই) যুক্ত করি।
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ব্যবহারকারীর + পাসওয়ার্ডের প্রয়োজন নেই।
জুয়ুল

7

পিএইচপিএমআইএডমিন এবং অন্যান্য উত্স থেকে আপনি ব্যবহার করতে পারেন:

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 পুরো কমান্ডটি দেখায় না, কেবল প্রথমটি তখন ... আমার জন্য দুঃখজনক, হ্যাঁ।
MonneratRJ

6

আপনি যদি আপনার মাইএসকিউএল সার্ভারের সমস্ত ডাটাবেসে সমস্ত টেবিল বিশ্লেষণ, মেরামত এবং অনুকূল করতে চান তবে আপনি কমান্ড লাইন থেকে একযোগে এটি করতে পারেন। যদিও এটি করতে আপনার রুট প্রয়োজন।

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

একবার এটি চালানোর পরে, আপনাকে আপনার মাইএসকিউএল রুট পাসওয়ার্ড প্রবেশ করার অনুরোধ জানানো হবে। এরপরে, এটি শুরু হবে এবং ফলাফলগুলি এটি ঘটতে দেখলে আপনি দেখতে পাবেন।

উদাহরণ আউটপুট:

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 এর মধ্যে থেকে এটিকে পরিবর্তন করতে পারেন: হোম> এসকিউএল পরিষেবা> মাইএসকিউএল রুট পাসওয়ার্ড


5

কমান্ড লাইন থেকে:

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

তারপরে পাসওয়ার্ড টাইপ করুন


4

আপনি মাইএসকিএল ক্লায়েন্ট ব্যবহার করে ডাটাবেসের সমস্ত সারণী অনুকূলিত / চেক এবং মেরামত করতে পারেন।

প্রথমে, আপনার সমস্ত টেবিলের তালিকাটি ',' দিয়ে আলাদা করা উচিত:

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(মাইএসকিউএল গুই সরঞ্জামসমূহ অংশ) একটি ডাটাবেস স্তরের উপর যে কাজ করতে পারেন আপনার জন্য।

শুধু আপনার স্কিমা নির্বাচন করুন এবং টিপুন Maintenance নীচের ডানদিকে কোণায় বোতাম ।

যেহেতু জিইউআই সরঞ্জামগুলি জীবনের শেষ পর্যায়ে পৌঁছেছে তারা মাইএসকিএল পৃষ্ঠায় খুঁজে পাওয়া শক্ত hard গুগলের মাধ্যমে সেগুলি খুঁজে পেয়েছে: পেয়েছে http://dev.mysql.com/downloads/gui-tools/5.0.html

আমি জানি না যে নতুন মাইএসকিউএল ওয়ার্কবেঞ্চও এটি করতে পারে কিনা।

এবং আপনি 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.