কেন 'লড ডেটা ইনফিল' স্বাভাবিক ইনসার্টের বিবৃতিগুলির চেয়ে দ্রুত?


22

আমি একটি নিবন্ধ যে উল্লেখ আমরা অর্জন করতে পারেন পড়েছি প্রতি সেকেন্ডে 60,000 টিপে ব্যবহার করে LOAD DATA IN FILEবিবৃতি, যে একটি ডাটাবেসের মধ্যে CSV ফাইল এবং টিপে তথ্য থেকে পড়া হয়।

কেন এটি সাধারণ সন্নিবেশ থেকে পৃথক হওয়া উচিত?

সম্পাদনা:
আমি কেবল একটি INSERTবিবৃতি কল করে রাউন্ড ট্রিপ হ্রাস করেছি :

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');

এই সম্পর্কে কি?


আমি মাঝারি উপর একটি নিবন্ধ লিখেছি, বর্ধিত সন্নিবেশ বনাম LOAD DATA INFILE: মাইএসকিউএল সহ উচ্চ-গতির সন্নিবেশগুলি । নীচের লাইন: আপনি LOAD DATA INFILEবর্ধিত সন্নিবেশ ব্যবহারের পারফরম্যান্সের 65% অর্জন করতে পারেন । আমি আধুনিক হার্ডওয়্যারে 240,000 সন্নিবেশ / সেকেন্ড পেয়েছি।
বেঞ্জামিন

উত্তর:


26

লোড ডেটা ইনফাইলে এবং বর্ধিত ইনসার্টগুলির প্রত্যেকের স্বতন্ত্র সুবিধা রয়েছে।

লড ডেটা ইনফাইলটি একক ক্রিয়ায় টেবিলের ডেটা ভর করে লোড করার জন্য ডিজাইন করা হয়েছে সাথে বেলস এবং শিসিসের মতো টিংগুলি সম্পাদন করতে:

  • প্রাথমিক লাইনগুলি এড়িয়ে চলেছে
  • নির্দিষ্ট কলামগুলি এড়ানো হচ্ছে
  • রূপান্তরকারী নির্দিষ্ট কলামগুলি
  • নির্দিষ্ট কলাম লোড হচ্ছে
  • সদৃশ কী ইস্যু পরিচালনা করছে

বিশ্লেষণের জন্য কম ওভারহেডের প্রয়োজন

ফ্লিপ দিকে, আপনি যদি 1,000,000 সারিগুলির পরিবর্তে 100 টি সারি আমদানি করে থাকেন তবে বর্ধিত INSERT বুদ্ধিমান।

খেয়াল করুন যে মাইএসকিএলডাম ডেটা সহ টেবিল ডিজাইনের বহন করার জন্য বর্ধিত INSERT এর আশেপাশে নকশা করা হয়েছিল কারণ এটি প্রতি INSERT- এ কয়েকশো বা কয়েক হাজার সারি ইনজেকশন সঞ্চালন করে। লোড ডেটা ইনফাইল সর্বদা স্কিমা এবং ডেটার মধ্যে একটি শারীরিক দ্বিচক্রোটি তৈরি করে।

অ্যাপ্লিকেশন পয়েন্ট অফ ভিউ থেকে, লড ডেটা ইনফিল বর্ধিত INSERTs এর চেয়ে স্কিমা পরিবর্তনের ক্ষেত্রে আরও সংবেদনশীল।

লোড ডেটা ইনফিল ব্যবহার করার জন্য কেউ ভাল, খারাপ এবং কুরুচিপূর্ণ দিকে পিছনে যেতে পারে। আপনি কোন কৌশলটি ব্যবহার করেন তা বিবেচনা না করেই আপনাকে সর্বদা বাল্ক_ইনটার্ট_বাফলার_সাইজ সেট করতে হবে । কেন?

বাল্ক_ইনটার্ট_বাফার_সাইজে মাইএসকিউএল ডকুমেন্টেশন অনুসারে:

মাইআইএসএএম সংক্ষিপ্তসারের জন্য বাল্ক সন্নিবেশগুলি দ্রুততর করার জন্য একটি বিশেষ গাছের মতো ক্যাশে ব্যবহার করে ... অমানবিকতায় ডেটা যুক্ত করার সময় নির্বাচন করুন, নির্বাচন করুন ... ভ্যালু (...), (...), ... এবং লোড ডেটা ইনফিল করুন টেবিল। এই পরিবর্তনশীলটি থ্রেড প্রতি বাইটে ক্যাশে গাছের আকার সীমাবদ্ধ করে। এটিকে 0 এ সেট করা এই অপ্টিমাইজেশনটিকে অক্ষম করে। ডিফল্ট মান 8MB।

কয়েক বছর ধরে, আমি ক্লায়েন্টকে এটি সেট না করার পরে দেখেছি এবং এটি 8MB এ রেখে দেয়। তারপরে, যখন তারা লোড ডেটা ইনফিল ব্যবহার করার বা মাইএসকিল্ডাম্পস আমদানির সিদ্ধান্ত নেয়, তখন তারা কিছু ভুল বুঝতে পারে। আমি সাধারণত এটি মাঝারি 256 এম এ সেট করার পরামর্শ দিই। কিছু ক্ষেত্রে, 512 এম।

একবার আপনার কাছে যথেষ্ট পরিমাণে বাল্ক ইনসার্ট বাফার হয়ে গেলে কৌশলটি ব্যবহার করে একাডেমিক রেন্ডার করা হয় এবং ব্যক্তিগত পছন্দ হিসাবে সেদ্ধ হয়। অ্যাপ্লিকেশনগুলির জন্য যেখানে আপনি চাহিদার ভিত্তিতে মাত্র 100 টি সারি সন্নিবেশ করান সেখানে বর্ধিত INSERT গুলি আটকে দিন।

সমস্ত ন্যায়সঙ্গতভাবে, লোড ডেটা ইনফিল বলা দ্রুত হয় যে সাধারণ INSERT স্টেটমেন্টগুলি বোঝা স্টেটমেন্টের এক ধরণের কারণ মূলত কনফিগারেশনটিকে বিবেচনায় নেওয়া হয় না। এমনকি যদি আপনি সঠিকভাবে বাল্ক_ইনটার্ট_ফুফার_সাইজ সহ লোড ডেটা ইনফিল এবং প্রসারিত INSERT এর মধ্যে একটি বেঞ্চমার্ক সেটআপ করেন তবে প্রতিটি সারি পার্স করার সময় সংরক্ষিত ন্যানোসেকেন্ডগুলি কেবলমাত্র লোড ডেটা ইনফিলের পক্ষে সর্বাধিক নামমাত্র ফলাফল দিতে পারে।

এগিয়ে যান এবং এটি my.cnf এ যুক্ত করুন

[mysqld]
bulk_inset_buffer_size=256M

আপনি বর্ধিত INSERT গুলি চালু করার আগে এটি কেবল আপনার সেশনের জন্য সেট করতে পারেন

SET bulk_insert_buffer_size= 1024 * 1024 * 256;

আপডেট 2012-07-19 14:58 ইডিটি

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


4

বেশিরভাগ ডাটাবেস ম্যানেজমেন্ট সিস্টেমগুলিতে দ্রুত পরিমাণে ডেটা লোড করার জন্য একটি বাল্ক লোড সুবিধা রয়েছে facility একটি INSERTবিবৃতিতে প্রতি-বিবৃতিতে ব্যাগের উল্লেখযোগ্য পরিমাণ রয়েছে - লকিং, লেনদেনের সীমাবদ্ধতা, রেফারেন্সিয়াল অখণ্ডতা যাচাই, সংস্থানসমূহের বরাদ্দ, I / O যা প্রতি বিবৃতি ভিত্তিতে করতে হয়।

বাল্ক সন্নিবেশ ক্রিয়াকলাপগুলি প্রক্রিয়াটিকে প্রবাহিত করে যাতে এই স্টাফের প্রতি সারিতে অনেক বেশি, কম ওভারহেড থাকে। একটি ডিবিএমএস সন্নিবেশ বিবৃতিগুলির চেয়ে দ্রুত পরিমাণের ডেটা অর্ডারগুলি দ্রুত লোড করতে পারে।


3

পৃথক INSERTবিবৃতিগুলি পার্সিং এবং কার্যকর করে সিএসভি ফাইলকে কলামগুলিতে বিভক্ত করা এবং সেগুলি সরাসরি লোড করার চেয়ে অনেক বড় ওভারহেড বহন করে।

প্রতিটি INSERTবিবৃতি পৃথকভাবে মাইএসকিউএল ইঞ্জিন দ্বারা বিশ্লেষণ করতে হবে এবং বৈধতার জন্য যাচাই করা উচিত - এটি অতিরিক্ত সিপিইউ সংস্থান গ্রহণ করে এবং আরও ক্লায়েন্ট <> সার্ভার রাউন্ড-ট্রিপস প্রয়োজন। মাধ্যমে বাল্ক লোড করার সময় এটি হওয়ার দরকার নেই LOAD DATA INFILELOAD DATA INFILEখালি টেবিলে লোড করার সময় এমন অপটিমাইজেশনগুলিও ঘটতে পারে। আরও তথ্যের জন্য এই লিঙ্কটি দেখুন ।


আমার প্রশ্নের সম্পাদনা অংশ দেখুন।
ALH

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