কেন ইনডোডবি_ফাইলে_ ট্যাপেল ব্যবহার করছেন?


27

এখানে অনেক নিবন্ধ অতিরঞ্জিত (অবশ্যই আইএমএইচও) প্রয়োজন innodb_file_per_table। আমি বুঝতে পারি যে innodb_file_per_tableপৃথক টেবিলগুলির উপর আরও ভাল নিয়ন্ত্রণ থাকা উচিত; পৃথকভাবে প্রতিটি টেবিল ব্যাকআপ মত। তবে আরও ভাল পারফরম্যান্সের দাবিটি প্রশ্নবিদ্ধ।

আমার পরীক্ষার ইন, কর্মক্ষমতা কোন পার্থক্য নেই innodb_file_per_tableএবং ibdata160GB এর একটি ডেটাবেস জন্য। অবশ্যই এটি সাধারণ প্রশ্নের সাথে একটি সাধারণ পরীক্ষা ছিল, এবং বাস্তব জীবনের জটিল প্রশ্নের জন্য পরিস্থিতি আলাদা হতে পারে (এই কারণেই আমি এই প্রশ্নটি জিজ্ঞাসা করেছি)। 64-বিট লিনাক্স সহ ext4কার্যকরভাবে বড় ফাইলগুলি পরিচালনা করতে পারে।

সহ innodb_file_per_table, আরও ডিস্ক আই / ও অপারেশন প্রয়োজন; এবং এটি জটিল JOINগুলি এবং FOREIGN KEYসীমাবদ্ধতার ক্ষেত্রে তাৎপর্যপূর্ণ ।

টেবিলস্পেস একক উপর ভাগ করা হয় ibdata; আলাদা টেবিলের জন্য উত্সর্গীকৃত টেবিল স্পেসগুলি কীভাবে ডিস্কের স্থান বাঁচাতে পারে? অবশ্যই, প্রতিটি টেবিলের সাথে টেবিলের জায়গাটি মুক্ত করা সহজ ALTER, তবে এটি এখনও একটি ব্যয়বহুল প্রক্রিয়া (টেবিল লক সহ)।

প্রশ্ন: মাইএসকিএল- innodb_file_per_tableএর আরও ভাল পারফরম্যান্সে কী প্রভাব ফেলে? যদি হ্যাঁ, কেন?


আমার প্রশ্নের এই উত্তরটি দেখুন: dba.stackexchange.com/questions/7924/… পাশাপাশি সহায়তা করতে পারে।
কেএম

উত্তর:


19

আমি মনে করি না এটি কোনও পারফরম্যান্সের বিষয় কিন্তু ম্যানেজমেন্টের বিষয়।

প্রতি টেবিলে পৃথক ফাইলের সাহায্যে উদাহরণস্বরূপ আপনি বিভিন্ন স্টোরেজ ডিভাইসে বিভিন্ন ডাটাবেস সঞ্চয় করতে পারেন।

আপনি ফাইল সিস্টেমে খুব বড় ডেটাবেসগুলির ক্ষেত্রে ডিল করতে পারেন যা বড় ফাইলগুলি হ্যান্ডেল করতে পারে না (একটি টেবিল ফাইলের আকারের সীমাতে পৌঁছানো পর্যন্ত কমপক্ষে সমস্যা স্থগিত করুন)।

আপনার অনিয়ন্ত্রিত টেবিলস্পেসের বৃদ্ধি নেই। যদি আপনি কিছু বড় টেবিলগুলি ফেলে ibdataরাখেন তবে ফাইলটি ছোট থাকে।

পারফরম্যান্সে কিছুটা প্রভাব ফেলতে পারে এমন একটি দিক হ'ল টেবিলের ডেটা এবং সূচীগুলির বিভাজন, যা প্রতি টেবিলে সীমাবদ্ধ থাকবে। তবে তা নিশ্চিত হওয়ার জন্য পরীক্ষার প্রয়োজন।


টেবিলস্পেসের বৃদ্ধি হুবহু আপনি চান কেন innodb_file_per_table
sjas

13

কেন ইনডোডবি_ফাইলে_ ট্যাপেল ব্যবহার করছেন?

কারণ এটি ফাইল-স্তরে করা যায় বলে স্বতন্ত্র পরিচালনা করা সহজ। এর অর্থ সার্ভারটি ডাউন থাকলেও আপনি টেবিলের ফাইলগুলি অনুলিপি করে এখনও অনুলিপি করতে পারেন যেখানে ভাগ করা টেবিল-স্পেস ব্যবহার করার অর্থ হ'ল অযৌক্তিকভাবে বিশাল হতে পারে এমন সমস্ত কিছু অনুলিপি করা , বা সার্ভারকে ডেটা উত্তোলনের জন্য চালানোর কোনও উপায় খুঁজে পাওয়া ( আপনি সত্যই কোনও হেক্স-সম্পাদকের সাহায্যে ম্যানুয়ালি ডেটা বের করতে চান না)।

কেউ সতর্ক করে দিয়েছিল যে আপনি কেবল .ibdএকটি সার্ভার থেকে অন্য সার্ভারে ফাইলগুলি অনুলিপি এবং আটকানোতে পারবেন না । এই সত্য হতে পারে, কিন্তু এটা একই সার্ভারে ব্যাকআপ ক্ষেত্রে প্রযোজ্য নয় উচিত (আমি শব্দ ব্যবহার করছি ব্যাকআপ এখানে একটি কপি তৈরীর প্রথাগত অর্থে; অর্থাত, আয়তন বহুলাংশে না পুরো জিনিস পরিবর্তন)। তদ্ব্যতীত, ibdata1স্বয়ংক্রিয়ভাবে শুরুতে পুনরায় তৈরি করা হয় (যেমন বেশিরভাগ "ফাইল-প্রতি টেবিলে ফাইল রূপান্তর" গাইডের মোছারibdata1 পদক্ষেপে দেখা যায় )। যেমন, আপনি কি না কপি করা আবশ্যক ibdata1আপনার ছাড়াও .ibdফাইল (এবং তাদের সংশ্লিষ্ট .frmইত্যাদি ফাইল)।

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

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

আশ্চর্যের বিষয় নয় যে, পারফরম্যান্সটি ব্যবহারের ক্ষেত্রে নির্দিষ্ট ডেটাবেসগুলির উপর নির্ভর করবে। একজনের কাছ থেকে অন্যের (এমনকি ব্যাপকভাবে) পৃথক ফলাফল হবে।

এটি সত্য যে ফাইল-প্রতি-সারণীতে আরও বেশি ডিস্ক I / O অপারেশন থাকবে তবে কেবল কিছুটা বেশি। সিস্টেমটি কীভাবে কাজ করে তা ভেবে দেখুন।

  • মনোলিথিক ডাটাবেসের জন্য:

    1. সার্ভার শুরু হয়েছে
    2. ibdata1 খোলা আছে
    3. শিরোনাম এবং মেটা-ডেটা পড়া হয়
    4. স্ট্রাকচার এবং মেটা-ডেটা মেমরিতে ক্যাশে হয়
    5. প্রশ্নগুলি ঘটে
      1. সার্ভার ডিস্ক অ্যাক্সেস করে এবং ইতিমধ্যে খোলা থেকে ডেটা পড়ে ibdata1
      2. সার্ভার মেমরিতে ডেটা ক্যাশে করতে পারে
  • প্রতি টেবিল ডাটাবেসের জন্য:

    1. সার্ভার শুরু হয়েছে
    2. ibdata1 খোলা আছে
    3. শিরোনাম এবং মেটা-ডেটা পড়া হয়
    4. প্রতিটি স্বতন্ত্র .ibdফাইল খোলা আছে
    5. প্রতিটি .ibdফাইল থেকে শিরোনাম এবং মেটা-ডেটা পড়া হয়
    6. স্ট্রাকচার এবং মেটা-ডেটা মেমরিতে ক্যাশে হয়
    7. প্রশ্নগুলি ঘটে
      1. সার্ভার ডিস্ক অ্যাক্সেস করে এবং ইতিমধ্যে খোলা .ibdফাইল থেকে ডেটা পড়ে
      2. সার্ভার মেমরিতে ডেটা ক্যাশে করতে পারে

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

যেমন, সার্ভারটি শুরু হওয়ার পরে শুরুতে আরও কয়েকটি আই / ও ক্রিয়াকলাপ রয়েছে; এটি চলমান যখন না। তদাতিরিক্ত, প্রতিটি পৃথক .ibdফাইলের নিজস্ব পৃথক ওভারহেড (ফাইল স্বাক্ষর, কাঠামো ইত্যাদি) থাকা অবস্থায় এগুলি মেমোরিতে ক্যাশে থাকে এবং প্রতিটি ক্যোয়ারির জন্য পুনরায় পড়া হয় না। তদুপরি, একই কাঠামোগুলি একটি ভাগ করা টেবিল-স্পেস সহ এমনকি পড়া হয়, সুতরাং সেখানে সবেমাত্র কোনও (যদি কোনও হয় তবে) আরও মেমরি প্রয়োজন।

ইনেসোডবি_ফিল_পিটার_সত্তার কি মাইএসকিএল-এর আরও ভাল পারফরম্যান্সে প্রভাব ফেলে?

আসলে, যদি কিছু হয় তবে পারফরম্যান্সটি আরও খারাপ হতে পারে

একটি ভাগ করা টেবিল-স্পেস ব্যবহার করার সময়, পড়ুন এবং লেখার ক্রিয়াকলাপগুলি মাঝে মাঝে / প্রায়শই একত্রিত করা যায় যাতে সার্ভার একাধিক টেবিল থেকে ডেটা একটি স্যাচ একবারে পড়তে পারে ibdata

তবে, যদি ডেটা একাধিক ফাইলের মধ্যে ছড়িয়ে যায় তবে তার জন্য পৃথকভাবে প্রতিটিের জন্য আলাদা আই / ও অপারেশন করতে হবে।

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

টেবিলস্পেস একক ইবদাটাতে ভাগ করা হয়; আলাদা টেবিলের জন্য উত্সর্গীকৃত টেবিল স্পেসগুলি কীভাবে ডিস্কের স্থান বাঁচাতে পারে?

এটা না. যদি কিছু হয় তবে এটি কিছুটা ডিস্ক ব্যবহার বাড়িয়ে তোলে।

পরীক্ষার জন্য আমার কাছে একটি 60 জিবি ডাটাবেস নেই, তবে আমার "পল্ট্রি" ব্যক্তিগত ডেটাবেস যা আমার ওয়ার্ডপ্রেস ইনস্টলেশন এবং ব্যক্তিগত ব্যবহার এবং বিকাশের পরীক্ষার জন্য কয়েকটি ছোট টেবিলের শেয়ারের টেবিল-স্পেস ব্যবহার করার সময় ~ 30MB এ ওজন করেছে। এটিকে ফাইল-প্রতি-সারণিতে রূপান্তরিত করার পরে, এটি ফুল B 85 এমবিতে পরিণত হয়েছে। এমনকি সমস্ত কিছু বাদ দিয়ে এবং পুনরায় আমদানি করেও এটি> 60 এমবি ছিল।

এই বৃদ্ধি দুটি কারণের কারণে:

  • এর জন্য নিখুঁত ন্যূনতম আকার ibdata1হ'ল কোনও কারণে 10MB, এমনকি যদি আপনার information_schemaএটিতে সঞ্চয় না করে থাকে তবে।

  • একটি ভাগ করা টেবিল-স্পেস সহ কেবল ibdata1ফাইলের স্বাক্ষর, মেটা-ডেটা ইত্যাদির মতো ওভারহেড থাকে তবে প্রতি টেবিলের সাথে প্রতিটি স্বতন্ত্র .ibdফাইলে সমস্ত থাকে। এর অর্থ হ'ল মোট (এমনকি একটি কাল্পনিক <10MB সহ ibdata1) কমপক্ষে কিছুটা বড় হবে:

    GetTotalSizeofOverhead() * GetNumTables()

স্পষ্টতই এগুলি বড় পরিমাণে বৃদ্ধি পাবে না (যদি না আপনি কোনও হোস্ট ব্যবহার করেন যা আপনার ডাটাবেসের আকারকে সীমাবদ্ধ করে না বা ফ্ল্যাশ ড্রাইভ ইত্যাদিতে এগুলি সঞ্চয় করে) তবে তা তবুও বৃদ্ধি পাবে এবং ( প্রতিটি ) টেবিলটি ফাইলটিতে স্যুইচ করার মাধ্যমে -per-টেবিল আপনি সঙ্কুচিত করতে পারেন ibdata110MB নিচে সামগ্রিক মোট অপরিবর্তনীয়ভাবে হতে হবে আরো তুলনায় এটি ছিল।


11

ইনোডাব_ফিল_পিটার_সামগ্রী ব্যবহার করার জন্য এটি সর্বদা আমার কারণ:

টেবিল প্রতি ফাইল ব্যতীত, ইবদাটা ফাইল কখনও সংকোচনে বা সঙ্কুচিত হয় না বা কখনও স্থানটিতে সংকুচিত হয় না। আপনি যখন কোনও সারি মুছবেন না, একটি টেবিল বা একটি ডেটাবেস ড্রপ করবেন না। আপনার যদি সক্রিয় কুইউিং সিস্টেম থাকে তবে 2 জিবি ডেটা কোনও সময়েই 20 জিবি ফাইল হতে পারে।

ধরা যাক আপনি কোনও পরিবর্তনের আগে আপনার বর্তমান 1 জিবি টেবিলের একটি ব্যাকআপ তৈরি করতে চান, তারপরে এটি বাদ দিন। আপনি আপনার ইবদাতার এক অবধি অব্যবহৃত স্থান আটকে আছেন stuck হতাশাজনক।

অস্থায়ী ব্যবস্থাগুলি একক ডেটা ফাইলগুলিকে সঞ্চারিত করে এমন উদাহরণগুলির সম্ভবত অন্তহীন উদাহরণ রয়েছে তবে আমার মতে, ইনোডাব_ফিল_পিটার_ট্যাবলটি ব্যবহার না করার কোনও কারণ নেই suff

এছাড়াও, এখানে পড়ার জন্য একটি ভাল পোস্ট: http://code.openark.org/blog/mysql/reason-to-use-innodb_file_per_table


1
আমি বুঝতে পেরেছিলাম যে এটি সবসময় করা ভাল। এসএসডি দ্বারা সমর্থনযুক্ত চৌম্বকীয় স্টোরেজ অ্যারেগুলি টেবিলগুলির জন্য ছোট ফাইলগুলির বিরুদ্ধে আরও কার্যকরভাবে পঠন / লেখার ক্যাশে পরিচালনা করতে পারে। গুচ্ছ টেবিলের জন্য যে% 99.99 সময়টি কেবল 'পঠন' পাওয়া যায় তবে লিখিত হয় না, সেগুলি সর্বদা স্টোরেজ নিয়ন্ত্রকের ক্যাশে থাকে যা প্রতিক্রিয়া সময়ের ক্ষেত্রে দুর্দান্ত হ্রাস।
sdkks

5

ইনোডাব_ফায়াল_পার_সেবিকা ব্যবহার না করার আমার কারণটি হল পারফরম্যান্স।

আমি মাইএসকিএল 5.5.45 লিনাক্স সেন্টোজ রিলিজ 6.7 এ 450 সারণী সহ আমাদের ডাটাবেসের জন্য কিছু পরীক্ষা করেছি

জন্য ইউনিট পরীক্ষা যা প্রতিটি পরীক্ষার আগে ডাটাবেসের মধ্যে রাজধানী সন্নিবেশ (সমস্ত টেবিল সব ব্যবহার করছেন না) এবং নিজেই পরীক্ষা অনেক ডাটাবেসের সঙ্গে কাজ করে (টিপে, আপডেট করে মোছা হয়, নির্বাচন) কর্মক্ষমতা 3-5x ভাল ছিল ডাটাবেজ টেবিল ছিল না আরও ফাইলে বিভক্ত।

আপনি ইনডোডবি_ফাইলে_পার_ টেবিল ব্যবহার করার সিদ্ধান্ত নেওয়ার আগে আপনার ব্যবহারকারীর প্রশ্নের সাথে আপনার ডাটাবেসটি পরীক্ষা করার এবং এটির তুলনা করার পরামর্শ দিচ্ছি

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


2
আমি অনুমান করছি যে 450 টেবিল বনাম একটি একক ফাইল বরাদ্দকরণের জন্য প্রাথমিক ফাইলগুলি বরাদ্দ করতে প্রয়োজনীয় সময়ের কারণে এটি this উত্পাদনে এটি কেবল একবার ঘটবে তাই সমস্যা হওয়া উচিত নয়, তবে আপনি একটি ভাল বক্তব্য রাখেন যে দ্রুত একটি ডেটাবেস তৈরি করার জন্য এবং তারপরে একেবারে ছিঁড়ে ফেলা এবং একক ইবদাটা ফাইলকে বারবার বলা ভাল ating
কলিনম

2

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

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

তবে এটি কোনও ডাটাবেসে কর্মক্ষমতা আরও খারাপ করতে পারে যা প্রচুর সন্নিবেশ এবং আপডেট করে। কারণ লেনদেনের পরে মাইএসকিএল স্টোরেজ ফাইলে fsync () কল করে। যদি কোনও একক ফাইল থাকে তবে এটি একটি কল করে এবং কলটি শেষ হওয়ার জন্য অপেক্ষা করে। যদি অনেকগুলি ফাইল থাকে তবে এটি একাধিকবার কল করতে হবে এবং কমিট কমান্ড ফিরে আসার আগে এই সমস্ত কলগুলি ফিরে আসার জন্য অপেক্ষা করতে হবে।

এই সমস্যাটি দেখে এমন একজনের কাছ থেকে এখানে একটি পোস্ট দেওয়া হয়েছে: http://umangg.blogspot.com/2010/02/innodbfilepertable.html


2

নিচের নিবন্ধ অনুসারে, পারফরম্যান্স ডেটা পরিচালনা সম্পর্কে নয় (ক্রুড অপারেশন নিজেই) বরং বস্তুগুলি তৈরি এবং ড্রপ করার বিষয়ে।

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

https://www.percona.com/blog/2015/02/24/mysqls-innodb_file_per_table-slowing/


1

আইএমএইচও এটি ইনডোডবি_ফাইলে_ টেবিলটি আরও ভাল ব্যবহার করা যায়, এটি আরও সুরক্ষিত। আপনি যদি এটি ব্যবহার না করেন তবে আপনার FAT32 সিস্টেমে সমস্যা হতে পারে যেখানে কেবল 4 গিগাবাইট ফাইল অনুমোদিত। আমি স্লোভাক ভাষায় এ সম্পর্কে একটি নিবন্ধ লিখেছি ( https://www.itsoft.sk/preco-sa-neuvolni-miesto-na-disku-po-zmazani-mysql-tabulky/ )।

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