মাইএসকিউএল স্লো রাইটস


8

নিম্নলিখিত সারণিতে সন্নিবেশগুলি সম্পূর্ণ হতে 70 সেকেন্ড সময় নিয়েছে:

CREATE TABLE IF NOT EXISTS `productsCategories` (
  `categoriesId` int(11) NOT NULL,
  `productsId` int(11) NOT NULL,
  PRIMARY KEY (`categoriesId`,`productsId`),
  KEY `categoriesId` (`categoriesId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

টেবিলটিতে প্রায় 100,000 সারি রয়েছে এবং এটি ডিস্কে 7MB নিচ্ছে।

মাইএসকিউএলে এমন কিছু সেটিংস রয়েছে যা লেখার পারফরম্যান্সকে উন্নত করতে পারে?

আমার my.cnfফাইলটি নিম্নরূপ:

log-slow-queries="/var/log/mysql/slow-query.log"
long_query_time=1 
log-queries-not-using-indexes

innodb_buffer_pool_size=4G
innodb_log_buffer_size=4M
innodb_flush_log_at_trx_commit=2
innodb_thread_concurrency=8
innodb_flush_method=O_DIRECT

query_cache_size = 6G
key_buffer_size = 284M
query_cache_limit = 1024M
thread_cache_size = 128
table_cache = 12800

sort_buffer_size=2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M

read_buffer_size=128K

open_files_limit               = 1000
table_definition_cache         = 1024
table_open_cache               = 6000

max_heap_table_size=512M
tmp_table_size=4096M

max_connections=1000

thread_concurrency = 24

এখানে হার্ডওয়্যার সেটআপ রয়েছে:

  • ডেল আর 710
  • প্রক্রিয়ার অনুরূপ RAID10
  • 48 জি র‌্যাম

এই হার্ডওয়্যারটি দেওয়া, আমি আশা করব না যে সমস্যাটি একটি হার্ডওয়্যার বাধা হয়ে দাঁড়াবে।


আপনি কিছু উদ্দেশ্যমূলক তথ্য সরবরাহ করতে পারেন? লগগুলি, আপনার পরীক্ষার / বেঞ্চমার্কিংয়ের পদ্ধতি এবং ফলাফলগুলি, সেই জাতীয় জিনিস?
womble

আপনি কোন ধরণের লগ দেখতে চান? কেবল এতক্ষণ কেন এটি লাগে তা কেবল ডি মপটোপে থাকে । আমি টেবিলটিকে মাইসাম টেবিল, উচ্চতর স্মৃতি সীমা, উচ্চতর থ্রেডে পরিবর্তন হিসাবে পরীক্ষা করতাম test
রন 0

মাইএসকিএল উন্নয়নের সর্বোত্তম সেটিংটি হ'ল
অ্যান্টনি গিবস

থ্রেড_কেনচারન્સી = 24 এর কোনও প্রভাব নেই ... আপনি সেই লাইনটি ফেলে দিতে পারেন
অ্যান্টনি গিবস

উত্তর:


16

পর্যবেক্ষণ # 1

আমার চোখে ধরা পড়ার প্রথম জিনিসটি হ'ল টেবিলের কাঠামো

CREATE TABLE IF NOT EXISTS `productsCategories` (
  `categoriesId` int(11) NOT NULL,
  `productsId` int(11) NOT NULL,
  PRIMARY KEY (`categoriesId`,`productsId`),
  KEY `categoriesId` (`categoriesId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

অনুগ্রহ করে লক্ষ্য করুন যে categoriesIdসূচক এবং প্রাথমিক কী একই কলাম দিয়ে শুরু হয়। এটি একটি অপ্রয়োজনীয় সূচক। যেহেতু এই টেবিলটি InnoDB, তাই categoriesIdসূচকটি অন্য কারণে অনর্থক: সমস্ত সেকেন্ডারি সূচকে জেন_ ক্লাস্ট_ইন্ডেক্সে কী থাকে (ওরফে ক্লাস্টারড ইনডেক্স; মাইএসকিএল-তে জেন_ ক্লাস্ট_ইন্ডেক্স কী ব্যবহার করা হয় তা দেখুন ? )

আপনি যদি categoriesIdসূচকটি দিয়ে সরিয়ে দিন

ALTER TABLE productsCategories DROP INDEX categoriesId;

অতিরিক্ত মাধ্যমিক এবং ক্লাস্টারড সূচক রক্ষণাবেক্ষণ না করার কারণে এটি INSERTs নাটকীয়ভাবে উন্নত করবে ।

পর্যবেক্ষণ # 2

আপনি যদি কোনও বাল্ক সন্নিবেশকরণ অপারেশন করছেন, আপনার একটি বড় বাল্ক সন্নিবেশ বাফার প্রয়োজন

দয়া করে এটিতে আমার আগের পোস্টগুলি দেখুন:

পর্যবেক্ষণ # 3

আপনার লগ ফাইলের আকারটি খুব ছোট !!! এটি InnoDB বাফার পুলের 25% হওয়া উচিত, যা আপনার ক্ষেত্রে 1G হওয়া উচিত। ইনোডিবি লগ ফাইলগুলিকে পুনরায় আকার দেওয়ার জন্য আমার পোস্টটি দেখুন ।

পর্যবেক্ষণ # 4

দয়া করে, ইন্নাডব_থ্রেড_কেনসিটি সেট করবেন না !!! আমি সেটিংটি একা ছেড়ে যেতে পেরকোনা লাইভ এনওয়াইসি তে প্রথম শিখেছি । এটি মাইএসকিউএল 5.5, মাইএসকিউএল 5.1 ইনোডিবি প্লাগইন এবং পারকোনা সার্ভার 5.1+ এ ডিফল্টরূপে অক্ষম রয়েছে।

পর্যবেক্ষণ # 5

আপনাকে ইনোডাব_ফিল_পিটার_ টেবিল ব্যবহার করা দরকার। যদি এটি অক্ষম থাকে তবে আমি ফাইলটি রক্ষণাবেক্ষণ করি আইবিডাটা 1-কে একটি দুঃস্বপ্ন। এটি কার্যকর করতে InnoDB কীভাবে পরিষ্কার করবেন সে সম্পর্কে আমার পোস্টটি পড়ুন ।

পর্যবেক্ষণ # 6

আপনি যদি মাইএসকিউএল 5.5 বা পারকোনা সার্ভার ব্যবহার করছেন তবে ইনোডিবি কে একাধিক সিপিউ / একাধিক কোর ব্যবহার করার জন্য আপনাকে কয়েকটি বিকল্প সেট করতে হবে। দয়া করে সেটিংগুলিতে আমার পোস্টটি দেখুন ।

পর্যবেক্ষণ # 7

আপনার আছে innodb_log_buffer_size=4M। ডিফল্ট 8M হয়। এটি পুনরায় লগগুলিতে দ্বিগুণ ফ্লাশিং ঘটায়। এটি আপনার সেটিংকেও পাল্টা দেবে innodb_flush_log_at_trx_commit=2। দয়া করে এটি 32M তে সেট করুন। এছাড়াও, দয়া করে ইনোডাব_লগ_বাফলার_সাইজে মাইএসকিউএল ডকুমেন্টেশন দেখুন ।

এই পর্যবেক্ষণের আলোকে, দয়া করে নীচের সেটিংস যুক্ত করুন বা প্রতিস্থাপন করুন:

[mysqld]
innodb_thread_concurrency = 0
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_file_per_table
innodb_log_file_size=1G
innodb_log_buffer_size=1G
bulk_insert_buffer_size = 256M

ওহ ধন্যবাদ! আমি সমস্ত পয়েন্ট মুদ্রণ করেছি এবং এখন এটিতে কাজ করেছি এবং ভবিষ্যতে অন্যান্য লোকদের সহায়তা করার জন্য এটি মস্তিষ্কে সংরক্ষণ করেছি। অনেক ধন্যবাদ!
Ronn0

2
query_cache_sizeঅত্যধিক, খুব। প্রতিটি sertোকাতে 6GB পর্যন্ত ক্যাশে ফ্লাশ করা প্রয়োজন।
অ্যারন ব্রাউন

অ্যারোনব্রাউন আমি হাই পারফরম্যান্স মাইএসকিউএল বইতে পড়েছি যে ইনোডিবি কোয়েরি ক্যাশে InnoDB টেবিলের লেনদেন আইডির সাথে ক্লান্তিকর কাজ করে যা এটিকে কোনও প্র্রয়োজনীয় করে তোলে, ধীরে ধীরে উল্লেখ না করে কোয়েরি ক্যাশে ব্যবহার করে। আসলে, মাইএসকিউএল ৪.১ এ ইনোডিবি-র জন্য ক্যোয়ারী ক্যাশে অক্ষম রয়েছে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

আমি মনে করি ক্যোয়ারী ক্যাশে সঞ্চয়স্থান ইঞ্জিন থেকে সম্পূর্ণ পৃথক। এটি মূলত সমস্ত লেখার ক্রিয়াকলাপকে ক্রিয়াকলাপ দিয়ে সমস্ত কিছুর মধ্য দিয়ে যেতে এবং ক্যোয়ারী ক্যাশেটিকে অকার্যকর করে দেওয়ার জন্য জোর করে। আমি এর জন্য কখনও ব্যবহারের কেস পাইনি এবং এটি সর্বদা সমস্যা তৈরি করে।
অ্যারন ব্রাউন

আরও একটি জিনিস যুক্ত করতে হবে: ক্যোয়ারী_ক্যাচি_সাইজ = 6 জি <- এটি সম্পূর্ণ এবং একেবারে অবাস্তব। অনুসন্ধান ক্যাশে প্রায়শই ভাল অক্ষম থাকে এবং অবশ্যই 32M বা 64M এর চেয়ে বেশি হওয়া উচিত নয় be 6G ক্যোয়ারী ক্যাশে বজায় রাখার ওভারহেড অবশ্যই পারফরম্যান্সকে আঘাত করছে।
গ্যাভিন টোয়ে

0

আপনার পরীক্ষা করা উচিত innodb_log_file_size, ডিফল্ট সেটিংটি 5 এম যা নিবিড় সেটআপগুলি লেখার জন্য যথেষ্ট কম। এটি 100M এ সেট করার কথা বিবেচনা করুন। ib_logfile*নতুন সেটিংস দিয়ে ডিবি শুরু করতে আপনাকে পুরানো ফাইলগুলি মুছতে হবে । ডিবি সার্ভার চলাকালীন লগ ফাইলগুলি মুছবেন না, আপনাকে প্রথমে এটি বন্ধ করতে হবে। সম্ভবত আপনার পুরানো লগ ফাইলগুলি প্রথমে ব্যাকআপ করা উচিত, কেবল সেগুলি মুছুন না।

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