কম্পিউটার টিউটোরিয়াল

MySQL-এ INFORMATION_SCHEMA.KEY_COLUMN_USAGE পারফরম্যান্স সমস্যা সমাধান

MySQL-এ INFORMATION_SCHEMA.KEY_COLUMN_USAGE ক্যোয়ারি ধীর হলে, innodb_stats_on_metadata গ্লোবাল ভেরিয়েবল OFF (0) করে দিন। এটি মেটাডেটা স্ট্যাটিস্টিক্স রিফ্রেশ বন্ধ করে দেয় এবং ক্যোয়ারি গতি বাড়ায়।

সমাধান

SET GLOBAL innodb_stats_on_metadata = 0;

কারণ

ডিফল্টভাবে innodb_stats_on_metadata = ON থাকলে, INFORMATION_SCHEMA টেবিল ক্যোয়ারি করার সময় InnoDB প্রতিবার টেবিলের স্ট্যাটিস্টিক্স রিক্যালকুলেট করে। বড় ডাটাবেসে এটি দেরি করে।

উদাহরণ

SET GLOBAL innodb_stats_on_metadata = 0;

SELECT REFERENCED_TABLE_NAME, TABLE_NAME, COLUMN_NAME, CONSTRAINT_SCHEMA
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;

ফলাফল

674 rows in set (0.28 sec)

পূর্বে এটি কয়েক সেকেন্ড নিত。

স্থায়ী সমাধান (my.cnf / my.ini)

[mysqld]
innodb_stats_on_metadata = 0

MySQL রিস্টার্ট করলে লাগু হবে।

প্রভাব

  • ফায়দা: INFORMATION_SCHEMA ক্যোয়ারি (SHOW INDEX, SHOW CREATE TABLE, ফরেন কি চেক) দ্রুত হয়
  • ক্ষতি: অপ্টিমাইজার পুরনো স্ট্যাটিস্টিক্স ব্যবহার করতে পারে, ক্যোয়ারি প্ল্যান সাবঅপ্টিমাল হতে পারে
  • সমাধান: পিরিয়ডিক্যালি ANALYZE TABLE চালান

স্ট্যাটিস্টিক্স ম্যানুয়ালি আপডেট

ANALYZE TABLE table_name;

সতর্কতা

প্রোডাকশনে এই সেটিং পরিবর্তন করার আগে টেস্ট এনভায়রনমেন্টে বেঞ্চмар্ক করুন। কিছু কেসে ক্যোয়ারি প্ল্যান খারাপ হতে পারে।

  1. MySQL ডাটাবেসে একটি টেবিলের ব্যাকআপ নেওয়ার পদ্ধতি

  2. MySQL-এ sql_mode স্থায়ীভাবে (Permanently) সেট করা (Windows-এ my.ini)

  3. MySQL-এ ডিফল্ট মান NULL সেট করা

  4. MySQL কোয়ারীতে 'Empty set' প্রতিস্থাপন করা