প্রাথমিক কী হিসাবে মাইকিউএল ইন ভি বনাম ভারচার (ইনোডিবি স্টোরেজ ইঞ্জিন?


13

আমি একটি ওয়েব অ্যাপ্লিকেশন (প্রজেক্ট ম্যানেজমেন্ট সিস্টেম) তৈরি করছি এবং এটি যখন পারফরম্যান্সে আসে তখন আমি ভাবছিলাম ering

আমার একটি ইস্যু টেবিল রয়েছে যার ভিতরে রয়েছে 12 টি বিদেশী কীগুলি অন্যান্য অন্যান্য টেবিলের সাথে সংযুক্ত। এর মধ্যে 8 টির সাথে আমার অন্য টেবিলগুলি থেকে একটি ওয়েব অ্যাপ্লিকেশনটিতে রেকর্ডটি রেকর্ড করার জন্য শিরোনামের ক্ষেত্র পেতে যোগ দিতে হবে তবে তারপরে 8 টির সাথে যুক্ত হওয়া যা সত্যিই অত্যধিক বলে মনে হচ্ছে বিশেষত যেহেতু আমি কেবল টানছি যারা যোগ দেয় তাদের প্রত্যেকের জন্য 1 টি ক্ষেত্র।

এখন আমাকে স্থায়ীত্বের কারণে অটো ইনক্রিমেন্টিং প্রাইমারি কী (যদি না শারডিংয়ের ক্ষেত্রে জিইউইডি ব্যবহার করা উচিত তবে একটি উদ্বেগ না হয়) ব্যবহার করতে বলা হয়েছে তবে ভারচার (সর্বোচ্চ দৈর্ঘ্য 32) কার্যকারিতা অনুসারে ব্যবহার করা কতটা খারাপ? আমি বোঝাতে চাইছি এই টেবিলগুলির বেশিরভাগেরই সম্ভবত অনেকগুলি রেকর্ড নেই (তাদের বেশিরভাগের 20 বছরের কম বয়সী হওয়া উচিত)। এছাড়াও আমি যদি প্রাথমিক কী হিসাবে শিরোনামটি ব্যবহার করি তবে 95% বর্গক্ষেত্রের জন্য আমি 95% সময়ের সাথে যোগ দিতে হবে না, এমনকি আমি কোনও পারফরম্যান্স হিটও করতে পারি (আমার মনে হয়)। আমি কেবলমাত্র খারাপ দিকটিই ভাবতে পারি তা হ'ল আমার আরও বেশি ডিস্ক স্পেস ব্যবহার হবে (তবে একদিনের নিচে আসলেই এটি একটি বড় ব্যাপার)।

আমি এনামগুলির পরিবর্তে এই স্টাফের প্রচুর জন্য লুকিং টেবিলগুলি ব্যবহার করার কারণ হ'ল অ্যাপ্লিকেশনটির মাধ্যমে শেষ ব্যবহারকারী দ্বারা কনফিগার করার জন্য এই মানগুলির সমস্ত প্রয়োজন।

অনেকগুলি রেকর্ড ব্যতীত কোনও টেবিলের প্রাথমিক কী হিসাবে বার্চারটি ব্যবহার করার ডাউনসাইডগুলি কী কী?

আপডেট - কিছু পরীক্ষা

সুতরাং আমি এই স্টাফ উপর কিছু বেসিক পরীক্ষা করার সিদ্ধান্ত নিয়েছে। আমার 100000 রেকর্ড রয়েছে এবং এগুলি বেস কোয়েরি:

বেস ভিচারার এফ কে ক্যোয়ারী

SELECT i.id, i.key, i.title, i.reporterUserUsername, i.assignedUserUsername, i.projectTitle, 
i.ProjectComponentTitle, i.affectedProjectVersionTitle, i.originalFixedProjectVersionTitle, 
i.fixedProjectVersionTitle, i.durationEstimate, i.storyPoints, i.dueDate, 
i.issueSecurityLevelId, i.creatorUserUsername, i.createdTimestamp, 
i.updatedTimestamp, i.issueTypeId, i.issueStatusId
FROM ProjectManagement.Issues i

বেস আইএনটি এফকে ক্যোয়ারী

SELECT i.id, i.key, i.title, ru.username as reporterUserUsername, 
au.username as assignedUserUsername, p.title as projectTitle, 
pc.title as ProjectComponentTitle, pva.title as affectedProjectVersionTitle, 
pvo.title as originalFixedProjectVersionTitle, pvf.title as fixedProjectVersionTitle, 
i.durationEstimate, i.storyPoints, i.dueDate, isl.title as issueSecurityLevelId, 
cu.username as creatorUserUsername, i.createdTimestamp, i.updatedTimestamp, 
it.title as issueTypeId, is.title as issueStatusId
FROM ProjectManagement2.Issues i
INNER JOIN ProjectManagement2.IssueTypes `it` ON it.id = i.issueTypeId
INNER JOIN ProjectManagement2.IssueStatuses `is` ON is.id = i.issueStatusId
INNER JOIN ProjectManagement2.Users `ru` ON ru.id = i.reporterUserId
INNER JOIN ProjectManagement2.Users `au` ON au.id = i.assignedUserId
INNER JOIN ProjectManagement2.Users `cu` ON cu.id = i.creatorUserId
INNER JOIN ProjectManagement2.Projects `p` ON p.id = i.projectId
INNER JOIN ProjectManagement2.`ProjectComponents` `pc` ON pc.id = i.projectComponentId
INNER JOIN ProjectManagement2.ProjectVersions `pva` ON pva.id = i.affectedProjectVersionId
INNER JOIN ProjectManagement2.ProjectVersions `pvo` ON pvo.id = i.originalFixedProjectVersionId
INNER JOIN ProjectManagement2.ProjectVersions `pvf` ON pvf.id = i.fixedProjectVersionId
INNER JOIN ProjectManagement2.IssueSecurityLevels isl ON isl.id = i.issueSecurityLevelId

নিম্নলিখিত সংযোজনগুলির সাথে আমি এই কোয়েরিটিও চালিয়েছি:

  • নির্দিষ্ট আইটেম নির্বাচন করুন (যেখানে i.key = 43298)
  • আই আইড অনুসারে গ্রুপ করুন
  • অর্ডার করুন (IT.title int FK এর জন্য, i.issueTypeId বার্চার এফকে জন্য)
  • সীমা (50000, 100)
  • গ্রুপ এবং একসাথে সীমাবদ্ধ
  • গ্রুপ, অর্ডার এবং একসাথে সীমাবদ্ধ করুন

এইগুলির জন্য ফলাফলগুলি যেখানে:

QUERY টাইপ: ভর্কার এফকে সময় / INT এফ কে সময়


বেস ক্যোয়ারী: ms 4ms / ~ 52ms

নির্দিষ্ট আইটেমটি নির্বাচন করুন: ms 140ms / ~ 250ms

আই আইড অনুসারে গ্রুপ করুন: ms 4 এসএম / ~ 2.8 সেকেন্ড

অর্ডার করুন: ~ 231ms / sec 2 সেকেন্ড

সীমা: ~ 67ms / ~ 343ms

একসাথে গ্রুপ এবং সীমাবদ্ধ করুন: 4 504ms / sec 2 সেকেন্ড

গ্রুপ, অর্ডার এবং একসাথে সীমাবদ্ধ করুন: 4 504ms /~2.3sec

এখন আমি জানি না যে আমি এক বা অন্যটিকে (বা উভয়) দ্রুততর করার জন্য কী কনফিগারেশন করতে পারি তবে মনে হয় ভিচারার এফকে তথ্যের অনুসন্ধানগুলিতে দ্রুত দেখায় (কখনও কখনও অনেক দ্রুত)।

আমার ধারনা যে গতির উন্নতি অতিরিক্ত ডেটা / সূচকের আকারের জন্য মূল্যবান কিনা তা আমাকে বেছে নিতে হবে।


আপনার পরীক্ষাটি কিছু নির্দেশ করে। আমি বিভিন্ন InnoDB সেটিংস (বাফার পুল, ইত্যাদি) দিয়েও পরীক্ষা করবো কারণ ডিফল্ট মাইএসকিউএল সেটিংস সত্যই ইনোডিবি-র জন্য অনুকূলিত নয়।
ypercubeᵀᴹ

আপনার সন্নিবেশ / আপডেট / মুছে ফেলতে পারফরম্যান্স পরীক্ষা করা উচিত কারণ এটি সূচকের আকার দ্বারাও প্রভাবিত হতে পারে। প্রতিটি ইনোডিবি টেবিলের একটি ক্লাস্টার্ড কীটি সাধারণত পিকে হয় এবং এটি (পিকে) কলামটি প্রতিটি অন্যান্য সূচকে অন্তর্ভুক্ত থাকে। এটি সম্ভবত ইনোডিবি-র বড় পিকে এবং টেবিলের অনেকগুলি সূচকের এক বৃহত নেতিবাচক দিক (তবে 32 বাইট বরং মাঝারি, বড় নয়, তাই এটি সমস্যা নাও হতে পারে)।
ypercubeᵀᴹ

আপনার যদি বড় টেবিলগুলি পরীক্ষা করা উচিত (10-100M সারি বলুন বা তার চেয়ে বড়), আপনি যদি আশা করেন যে আপনার টেবিলগুলি 100K এর চেয়ে বেশি বাড়তে পারে (যা আসলে বড় নয়)।
ypercubeᵀᴹ

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

সিদ্ধান্তে আসার আগে কেবল আপনার ডিবি (এবং বিশেষত ইনোডিবি) সেটিংস পরীক্ষা করে দেখুন। ছোট রেফারেন্স সারণী সহ, আমি তাত্পর্যপূর্ণ বৃদ্ধি আশা করব না
ypercubeᵀᴹ

উত্তর:


9

আমি প্রাথমিক কীগুলির জন্য নিম্নলিখিত নিয়মগুলি অনুসরণ করি:

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

খ) যোগ দিতে পারফর্ম করতে হবে - ভার্চার্স বনাম পূর্ণসংখ্যায় যোগ দিতে প্রাথমিক কীটির দৈর্ঘ্য বাড়ার সাথে প্রায় 2x থেকে 3x ধীর হয়ে যায়, তাই আপনি নিজের কীগুলি পূর্ণসংখ্যা হিসাবে রাখতে চান। যেহেতু সমস্ত কম্পিউটার সিস্টেম বাইনারি হয় তাই আমি সন্দেহ করি যে এর কোজ স্ট্রিংটি বাইনারি হয়ে গেছে তবে অন্যদের সাথে তুলনা করা খুব ধীর

গ) সম্ভাব্যতম ক্ষুদ্রতম ডাটা প্রকারটি ব্যবহার করুন - যদি আপনি নিজের টেবিলটি খুব কম কলামে 52 মার্কিন যুক্তরাষ্ট্রের রাজ্যের কথা বলে আশা করেন, তবে 2 টি সংখ্যার কোডের জন্য সম্ভব সবচেয়ে ছোটতম টাইপ সম্ভবত একটি CHAR (2) ব্যবহার করুন, তবে আমি এখনও একটি ক্ষুদ্রাকৃতির জন্য যেতে চাই (128) কলামের জন্য বনাম একটি বৃহত্তর int যা 2 বিলিয়ন পর্যন্ত যেতে পারে

এছাড়াও প্রাথমিক কীগুলি থেকে অন্য টেবিলগুলিতে আপনার পরিবর্তনগুলি ক্যাসকেড করার ক্ষেত্রে আপনার একটি চ্যালেঞ্জ হবে যদি উদাহরণস্বরূপ প্রকল্পের নাম পরিবর্তন হয় (যা অস্বাভাবিক নয়)

আপনার প্রাথমিক কীগুলির জন্য ক্রমবর্ধমান অটো বর্ধমান পূর্ণসংখ্যার জন্য যান এবং ডাটাবেস সিস্টেমগুলি ভবিষ্যতে পরিবর্তনের জন্য সহায়তা সরবরাহ করে এমন ইনবিল্ট দক্ষতা অর্জন করে


1
স্ট্রিংগুলিকে বাইনারি হিসাবে পরিবর্তন করা হয় না; তারা প্রথম থেকেই বাইনারি মধ্যে সঞ্চিত আছে। এগুলি আর কীভাবে সংরক্ষণ করা হবে? সম্ভবত আপনি কেস-সংবেদনশীল তুলনা করার জন্য অপারেশনগুলির কথা ভাবছেন?
সমস্ত ব্যবসায়ের জন

6

আপনার পরীক্ষাগুলিতে আপনি ভার্চর বনাম ইন্ট কীগুলির পারফরম্যান্স পার্থক্যের তুলনা করছেন না বরং একাধিক যোগদানের ব্যয় করছেন। এতে অবাক হওয়ার কিছু নেই যে 1 টেবিলের অনুসন্ধান করা অনেকগুলি টেবিলের সাথে যোগ দেওয়ার চেয়ে দ্রুত joining ভার্সার
প্রাথমিক কীটির একটি নেতিবাচকতা অ্যাটেক্সডবা নির্দেশিত হিসাবে সূচকের আকার বাড়ছে । আপনার লুক টেবিলের পিকে ছাড়া অন্য কোনও সূচি না থাকলেও (যা বেশ সম্ভাবনা নয়, তবে সম্ভব) তবে প্রতিটি টেবিল যা দেখার জন্য রেফারেন্স দেয় এই কলামে একটি সূচি থাকবে।
প্রাকৃতিক প্রাথমিক কীগুলি সম্পর্কে অন্য একটি খারাপ বিষয় হ'ল তাদের মানটি পরিবর্তিত হতে পারে যা প্রচুর ক্যাসকেডিং আপডেটের কারণ হয়। সমস্ত আরডিএমএস নয়, উদাহরণস্বরূপ ওরাকল, এমনকি আপনারও দেওয়া হোকon update cascade। সাধারণভাবে, খুব খারাপ অনুশীলন হিসাবে বিবেচনা করে প্রাথমিক কী মান পরিবর্তন করা। আমি বলতে চাই না যে প্রাকৃতিক প্রাথমিক কীগুলি সর্বদা খারাপ থাকে; যদি অনুসন্ধানের মানগুলি ছোট হয় এবং কখনই পরিবর্তন হয় না বলে আমি মনে করি এটি গ্রহণযোগ্য হতে পারে।

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


3

সবচেয়ে বড় অবক্ষয় হ'ল পিকে পুনরাবৃত্তি। আপনি ডিস্ক স্পেসের ব্যবহার বৃদ্ধির বিষয়টি চিহ্নিত করেছেন তবে বর্ধিত সূচকের আকারটি পরিষ্কার হওয়া আপনার বড় উদ্বেগ। যেহেতু ইনানোডব একটি ক্লাস্টার্ড সূচক তাই প্রতিটি মাধ্যমিক সূচক অভ্যন্তরীণভাবে পিকেটির একটি অনুলিপি সঞ্চয় করে যা এটি শেষ পর্যন্ত মিলের রেকর্ডগুলি সন্ধান করতে ব্যবহার করে।

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

select sum(data_length+index_length) from information_schema.tables where engine='innodb';

তারপরে এটি করুন এবং আপনি সম্ভবত সুন্দর বসে থাকবেন। সাধারণ নিয়ম হিসাবে যদিও আপনি অন্য মাইএসকিএল ওভারহেড এবং ডিস ক্যাশে মোট সিস্টেমের মেমরির কমপক্ষে 30% - 40% রেখে যেতে চান। এবং এটি ধরে নিচ্ছে এটি একটি ডেডিকেটেড ডিবি সার্ভার। আপনার যদি সিস্টেমে অন্যান্য জিনিস চলমান থাকে তবে আপনার তাদের প্রয়োজনীয়তাও বিবেচনায় নেওয়া উচিত।


1

@Atxdba উত্তর ছাড়াও - যা আপনাকে ব্যাখ্যা করেছিল যে সংখ্যার ব্যবহারটি ডিস্কের জায়গার জন্য কেন ভাল হবে আমি দুটি পয়েন্ট যুক্ত করতে চেয়েছিলাম:

  1. যদি আপনার ইস্যুগুলির সারণীটি ভর্চার এফকে ভিত্তিক হয়, এবং ধরা যাক আপনার কাছে 20 টি ছোট ভ্রচার (32) এফকে রয়েছে, আপনার রেকর্ডটি 20x32bytes দৈর্ঘ্যে পৌঁছতে পারে, যখন আপনার উল্লিখিত হিসাবে অন্যান্য সারণীগুলি লকিং টেবিলগুলি রয়েছে, সুতরাং INT এফকে টিএনআইএনটি এফকে হতে পারে যা তৈরি করে 20 ক্ষেত্রের জন্য একটি 20 বাইট রেকর্ড। আমি জানি কয়েক শতাব্দী রেকর্ডের জন্য এটি খুব বেশি পরিবর্তিত হবে না তবে আপনি যখন কয়েক মিলিয়নে পৌঁছবেন তখন আমি অনুমান করি আপনি স্থান সংরক্ষণের জন্য প্রশংসা করবেন

  2. গতি ইস্যুটির জন্য আমি কভারিং সূচকগুলি ব্যবহার করে বিবেচনা করব, কারণ এই কোয়েরিতে মনে হচ্ছে আপনি অনুসন্ধান সারণীগুলি থেকে এত পরিমাণে তথ্য উদ্ধার করছেন না যা আমি সূচকে আচ্ছাদন করতে যাব এবং আবার আপনার পরীক্ষার সাথে ভর্চার এফকে / ডাব্লু / কভারিং সরবরাহ করা হবে সূচক এবং নিয়মিত আইএনটি এফকে।

আশা করি এটি সাহায্য করতে পারে,

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