খণ্ডিত মাইএসকিউএল টেবিলগুলি কীভাবে সন্ধান এবং ঠিক করতে পারে


27

আমি মাইএসকিউএলটিউনার ব্যবহার করেছি যা কিছু টেবিলগুলি খণ্ডিত করে দেখিয়েছিল। আমি ব্যবহার করতাম

mysqlcheck --optimize -A

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


1
আমি একই সমস্যা আছে। আমি মাইএসকিউএল 5.5 এর সাথে একটি নতুন ডিবি স্থাপন করছি এবং নির্দিষ্ট ইনোডিবি টেবিলগুলি কখনই সীমাহীন নয়। আমি অবাক হয়ে যাচ্ছি যে ডেটা_ফ্রি চেক (কায়াকজিমের উত্তরে দেখানো হয়েছে) ইনোডিবি টেবিলগুলির সাথে ভুল আছে।
ডক্যাচটা

উত্তর:


38

সংক্ষিপ্ত উত্তর:

select  ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables  where  DATA_FREE > 0;

"আপনার অবশ্যই জানা উচিত" উত্তর

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

এটি পারফরম্যান্সকে প্রভাবিত করে না, যতক্ষণ না খণ্ডগুলি খুব বেশি বেড়ে যায়। খুব বেশি ভাঙ্গন কী, ভাল আপনি যে ক্যোয়ারীটি সন্ধান করছেন তা দেখুন:

  select  ENGINE, TABLE_NAME,Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free from information_schema.tables  where  DATA_FREE > 0;

আপনার ডেটা এবং সূচকগুলি যে স্থানটি ব্যবহার করছে তা DATA_LENGTH এবং INDEX_LENGTH, এবং সমস্ত সারণী পৃষ্ঠাগুলিতে (টুকরোকরণ) অব্যবহৃত মোট বাইটের পরিমাণ হ'ল ডেটা_ফ্রেই।

এখানে প্রকৃত উত্পাদন সারণীর একটি উদাহরণ's

| ENGINE | TABLE_NAME               | data_length | index_length | data_free |
| InnoDB | comments                 |         896 |          316 |         5 |

এক্ষেত্রে আমাদের একটি টেবিল রয়েছে (896 + 316) = 1212 এমবি ব্যবহার করে এবং 5 এমবি বিশিষ্ট ডেটা রয়েছে। এর অর্থ এর "বিভাজনের অনুপাত":

5/1212 = 0.0041

... যা সত্যই কম "ভগ্নাংশ অনুপাত"।

আমি 0.2 এর কাছাকাছি অনুপাত সহ টেবিলের সাথে কাজ করছি (যার অর্থ ফাঁকা জায়গাগুলির 20%) এবং কোয়েরিগুলি কখনই কমিয়ে আনতে লক্ষ্য করি না, এমনকি যদি আমি টেবিলটি অপ্টিমাইজ করি তবে পারফরম্যান্সটি একই। তবে একটি 800 এমবি টেবিলটিতে একটি অনুকূলিত টেবিলটি প্রয়োগ করতে অনেক সময় লাগে এবং টেবিলটি কয়েক মিনিটের জন্য অবরুদ্ধ করে দেয়, যা উত্পাদনে অচল।

সুতরাং, আপনি যদি পারফরম্যান্সে কী জিতেন এবং কোনও টেবিলের অনুকূলকরণে সময় নষ্ট করে তা বিবেচনা করে, আমি পছন্দ না করাই পছন্দ করি।

আপনি যদি মনে করেন এটি স্টোরেজের জন্য ভাল, আপনার অনুপাত দেখুন এবং অনুকূলিতকরণের সময় আপনি কতটা জায়গা বাঁচাতে পারবেন তা দেখুন। এটি সাধারণত খুব বেশি হয় না, তাই আমি পছন্দ করি না।

এবং আপনি যদি অনুকূলিত হন তবে পরবর্তী আপডেটটি দুটি বা তার বেশি অংশে একটি পৃষ্ঠা বিভক্ত করে ফাঁকা স্থান তৈরি করবে। তবে খণ্ডিত টেবিলের চেয়ে খণ্ডিত টেবিলটি আপডেট করা দ্রুত, কারণ টেবিলটি যদি একটি সারিতে একটি খণ্ড খণ্ডিত হয় তবে অগত্যা কোনও পৃষ্ঠা বিভক্ত হবে।

এটি তোমাকে সাহায্য করবে বলে আশা করি।


1
যদিও এটি বেশ কয়েক বছর আগে থেকেই একটি উত্তর, আমি ভেবেছিলাম যে আমি উল্লেখ করব যে ডেটা_ফ্রিটি পুরো টেবিল স্পেসের জন্য একটি স্ট্যাটাস, এটি সারণীর জন্য নয়। আপনি যদি এক টেবিল স্পেসে একসাথে একাধিক টেবিল সঞ্চয় করেন তবে ডেটা_ফ্রি আপনাকে বিশ্বাস করতে বিভ্রান্ত করতে পারে যে টেবিলটিকে ডিফ্র্যাগমেন্টিং দরকার, যখন এর অর্থ কেবল টেবিল স্পেসে ফ্রি এক্সটেন্টস রয়েছে। অপ্টিমাইজ টেবিল চালানো নিখরচায় সীমাবদ্ধতা হ্রাস করবে না। টেবিলটিকে ডিফ্র্যাগমেন্ট করা এমনকি ফ্রি এক্সটেন্টগুলি বাড়িয়ে তুলতে পারে ।
বিল কারভিন 22'17

14

ফিলিপ-রোজাসের উত্তরে কেবল যুক্ত করতে আপনি প্রশ্নের অংশ হিসাবে খণ্ড অনুপাতটি গণনা করতে পারেন:

select ENGINE,
  concat(TABLE_SCHEMA, '.', TABLE_NAME) as table_name,
  round(DATA_LENGTH/1024/1024, 2) as data_length,
  round(INDEX_LENGTH/1024/1024, 2) as index_length,
  round(DATA_FREE/1024/1024, 2) as data_free,
  (data_free/(index_length+data_length)) as frag_ratio
FROM information_schema.tables
WHERE DATA_FREE > 0
ORDER BY frag_ratio DESC;

যদি কোনও টেবিলটি একটি ছোট শতাংশে খণ্ডিত হয় (5% এর চেয়ে কম?) তবে আপনি সম্ভবত এটি একা রেখে যেতে পারেন।

যে কোনও বড় কিছু এবং আপনার ডিবি ব্যবহারের ভিত্তিতে সারণী লক করা ইত্যাদির উপর ভিত্তি করে আপনাকে মূল্যায়ন করতে হবে যে সারণিকে ডিফ্র্যাগমেন্ট করা কতটা গুরুত্বপূর্ণ।


2

অপ্টিমাইজ টেবিলটি আসলে আপনার সমস্যাটি সমাধান করবে।

আপনার যদি কেবল কয়েকটি ডাটাবেস থাকে তবে আপনি আপনার সমস্ত ডেটাবেস ব্যবহারের জন্য PHPMyAdmin ব্যবহার করতে পারেন use ওভারহেড সহ টেবিলগুলি নির্বাচন করুন এবং তারপরে অনুকূলিত করতে নির্বাচন করুন।

আপনার যদি অনেক ডাটাবেস থাকে তবে অন্য একটি পদ্ধতি সম্ভবত পছন্দনীয়।

আমি প্রতি ঘন্টা চালানোর জন্য ক্রোনগুলিতে নিম্নলিখিত পিএইচপি স্ক্রিপ্ট সেটআপটি ব্যবহার করি।

$DB = new mysqli ('localhost', 'DbUser', 'DbPassword');
$results = $DB->query('show databases');
$allDbs = array();
while ($row = $results->fetch_array(MYSQLI_NUM))
{
    $allDbs[] = $row[0];
}
$results->close();
foreach ($allDbs as $dbName)
{
    if ($dbName != 'information_schema' && $dbName != 'mysql')
    {
        $DB->select_db($dbName);
        $results = $DB->query('SHOW TABLE STATUS WHERE Data_free > 0');
        if ($results->num_rows > 0)
        {
            while ($row = $results->fetch_assoc())
            {
                $DB->query('optimize table ' . $row['Name']);
            }
        }
        $results->close();
    }
}
$DB->close();

3
আমি বেশ নিশ্চিত যে mysqlcheck --optimize -Aএটি এসকিউএলOPTIMIZE TABLE <tablename>;
ডকুচাট

2

আমি এই পৃষ্ঠাটি জুড়ে এসেছি এবং ফিলিপ-রোজাস এবং সিসাদ্মিরাল দ্বারা অনুসন্ধানগুলি খুব সহায়ক বলে খুঁজে পেয়েছি। তবে আমার ক্ষেত্রে, আমি ডাব্লুএইচএমের পিএইচপিএমওয়াই অ্যাডমিনে ক্যোয়ারী চালিয়ে যাচ্ছিলাম এবং ডাটাবেস তালিকাভুক্ত না হওয়ায় কেবলমাত্র TABLE_NAME পাওয়া সহায়ক ছিল না এবং বেশ কয়েকটি ডাটাবেসে একই টেবিলের নাম রয়েছে। সুতরাং, কেবল যোগ করা TABLE_SCHEMAসেই কলামটিও সরবরাহ করবে।

select  ENGINE, TABLE_SCHEMA, TABLE_NAME, Round( DATA_LENGTH/1024/1024) as data_length , round(INDEX_LENGTH/1024/1024) as index_length, round(DATA_FREE/ 1024/1024) as data_free, (data_free/(index_length+data_length)) as frag_ratio from information_schema.tables  where  DATA_FREE > 0 order by frag_ratio desc

ডিবি দেখায়

ENGINE  | TABLE_SCHEMA  | TABLE_NAME    | data_length   | index_length  | data_free | frag_ratio

InnoDB  | db_name       | db_table      | 0             | 0             | 8         | 170.6667

"সংশোধন" করতে আমি phpMyAdmin এ ডিফ্রেগমেন্ট টেবিল লিঙ্কটি ব্যবহার করেছি প্রতিটি টেবিলের জন্য যার ফলস্বরূপ উচ্চ "ફ્રેগ_রেটিও" হয়েছে যার জন্য পিএইচপিএমআইএডমিন এক্সিকিউট করে:

ALTER TABLE `table_name` ENGINE = InnoDB;

0

মাইএসকিউএল এর ইনোডিবি ইঞ্জিন ব্যবহার করে একটি সারণী কখনই প্রয়োজন হয় না OPTIMIZEd

Data_freeহয় information_schema.tablesবা এর থেকে মান SHOW TABLE STATUSখুব প্রায়শই অ-শূন্য হয়, এমনকি আপনি যখন ভাবেন যে আপনি নিজের টেবিলগুলিকে ডিফ্র্যাগ করতে পারেন এমন সমস্ত কাজ করেছেন। তদুপরি, এই মেট্রিকটি বিভিন্ন খণ্ডগুলির মধ্যে কেবলমাত্র একটি যা ঘটতে এবং করতে পারে। (এছাড়াও, ব্লকগুলিতে নষ্ট স্থান, তালিকা পূর্বাবস্থায় ফেরা, সূচি বিটিরিজ বনাম ডেটা বিটিরিজ ইত্যাদি

এবং innodb_file_per_tableএর ব্যবহারকে জটিল করে তোলে Data_free। যদি টেবিল রয়েছে ibdata1, তারপর Data_freeসমগ্র tablespace- র বোঝায়; বরং একটি অকেজো সংখ্যা। যদি টেবিলটি তার নিজস্ব .ibdফাইলে থাকে তবে এটি কয়েকটি এমবি বা টেবিলের আকারের কিছু শতাংশ হতে পারে, যেটি বৃহত্তর।

শুধু যদি আপনি মুছে দিয়েছেন প্রচুর সারির এবং টেবিল ভর্তি মনস্থ না, পারে এটা মূল্য চলমান হতে OPTIMIZE TABLE

PARTITIONsএছাড়াও বিরক্তিকর পরিমাণ দেখায় Data_free, যেহেতু প্রতিটি পার্টিশন সাধারণত 4-7MB "ফ্রি" দেখায়। এবং এই দূরে যাবে না।

ডিফ্র্যাগমেন্ট কেন?

  • ওএসে স্থান ফেরাতে? হ্যাঁ, আপনি পারে এই সংক্ষিপ্তভাবে যদি আপনি ছিল অর্জন innodb_file_per_table=1। তবে আপনি সারি যুক্ত করার সাথে সাথে এটি ওএস থেকে ফিরিয়ে নেবেন।
  • অ্যাক্সেস গতি বাড়ানোর জন্য? ভুলে যান. ডিস্কে ব্লকগুলির বিন্যাস তুলনামূলকভাবে এলোমেলো এবং এটি গত কয়েক দশক ধরে। অর্ধ শতাব্দী আগে, ব্লকগুলি পুনরায় সাজানো কিছুটা গুরুত্বপূর্ণ ছিল।
  • বিটিআরসের ভারসাম্য বজায় রাখতে? তাই? তারা তাত্ক্ষণিকভাবে আবার ভারসাম্যহীন হয়ে উঠবে। বিটিআরসের স্থিতিশীল রাষ্ট্র যা এলোমেলোভাবে intoোকানো হয় 69%। এবং এটি এমনকি ফ্যাক্টর হয় না Data_free
  • মাইএসকিউএলটিউনার বলে? এই পণ্য শীতল করা প্রয়োজন।

একটি ইতিহাস নোট। যখন আমি বেশিরভাগ MyISAM টেবিল সঙ্গে DBAs সাহায্য, আমি 1000 টেবিল একটি সহযোগিতা হয়েছিল সম্ভবত 2 আউট আবিষ্কৃত মাসিক OPTIMIZE । তার পর থেকে, আমি হাজারো ইনোডিবি টেবিলের সাথে কাজ করেছি, এখনও একটি পারফরম্যান্স সমস্যা পেয়েছি যার দ্বারা সম্ভবত এটির সাহায্য দেওয়া হয়েছিল OPTIMIZE। (অবশ্যই, ডিস্ক জায়গার সমস্যা রয়েছে যার জন্য এটি OPTIMIZEসাহায্য করতে পারে তবে এটি জটিল হয়ে ওঠে - সাধারণত ডিবিএতে চালানোর জন্য পর্যাপ্ত ডিস্কের স্থান নেই OPTIMIZE!)

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