মাইএসকিউএল - বার্চারের দৈর্ঘ্য এবং কার্য সম্পাদন


19

VARCHARআকার ঘোষণা কি পারফরম্যান্সের জন্য অর্থবোধ করে? VARCHAR(50)এবং এর মধ্যে কোনও গতি আছে (গতিতে) VARCHAR(255)? বা দৈর্ঘ্য সংজ্ঞায়িত করা কি যুক্তি / ডিজাইনের সীমাবদ্ধতা?


উত্তর:


31

এটি একটি খুব সাধারণ "পরীক্ষা / সাক্ষাত্কারের প্রশ্ন"। আমি যথাসম্ভব উত্তম উত্তর দেব:

ইনোডিবি এবং মাইআইএসএএম (ডায়নামিক / কমপ্যাক্ট) এর স্ট্যান্ডার্ড সারি বিন্যাসে a VARCHAR(50)এবং a VARCHAR(255)একইভাবে স্ট্রিং টেক্সট সংরক্ষণ করবে- দৈর্ঘ্যের জন্য 1 বাইট এবং প্রকৃত স্ট্রিংটিতে অক্ষর প্রতি 1 এবং 4 বাইটের মধ্যে থাকবে (এনকোডিংয়ের উপর নির্ভর করে এবং প্রকৃত অক্ষর সঞ্চিত)।

আসলে, যদি আমি সঠিকভাবে মনে রাখি, আমি কাউকে হ্যাক্সাডেসিমাল সম্পাদকের মাধ্যমে ডেটা ডিকশনারিটি সংশোধন করার জন্য স্মরণ করতে পারি যাতে এর মতো কোনও কিছুকে এ-তে রূপান্তর করতে VARCHAR(50)হয় VARCHAR(100), তাই এটি গতিশীলভাবে করা যেতে পারে (সাধারণত, এটির জন্য একটি টেবিল পুনর্গঠন প্রয়োজন)। এবং এটি সম্ভব ছিল, কারণ প্রকৃত ডেটা সেই পরিবর্তনের দ্বারা প্রভাবিত হয়নি।

এটি সত্য নয় VARCHAR(256), কারণ দৈর্ঘ্যের জন্য 2 বাইট (কমপক্ষে) সর্বদা প্রয়োজন।

সুতরাং, তার মানে আমাদের সর্বদা করা উচিতVARCHAR(255) , তাই না? না । এর বেশ কয়েকটি কারণ রয়েছে।

InnoDB যখন একটি গতিশীল উপায়ে একটি ভার্চার সংরক্ষণ করতে পারে, অন্য ইঞ্জিনগুলির ক্ষেত্রে এটি সত্য নয়। মাইআইএসএএমের একটি নির্দিষ্ট সারি আকারের ফর্ম্যাট থাকে এবং মেমরি টেবিলগুলি সর্বদা আকারে স্থির থাকে। আমাদের অন্যান্য ইঞ্জিনগুলি সম্পর্কে যত্ন নেওয়া উচিত? হ্যাঁ, আমাদের উচিত, কারণ আমরা সেগুলি সরাসরি ব্যবহার না করলেও, স্মৃতি সারণীগুলি খুব সাধারণভাবে মধ্যবর্তী ফলাফলের জন্য ব্যবহৃত হয় (স্মৃতিতে অস্থায়ী টেবিলগুলি) এবং ফলাফলগুলি আগেই জানা যায়নি, সারণিটি সর্বোচ্চ আকার দিয়ে তৈরি করতে হবে সম্ভব - VARCHAR(255)যদি এটি আমাদের ধরণের হয়। যদি আপনি নষ্ট স্থানটি সম্পর্কে ভাবতে পারেন, আমরা যদি মাইএসকিউএল এর এনকোডিং ব্যবহার করি , তবে 'utf8' charsetস্মৃতি প্রতি সারিতে + 3 * 255 বাইট দৈর্ঘ্যের জন্য 2 বাইট সংরক্ষণ করবে(মানগুলির জন্য যা কেবল ইনোডিবিতে কয়েকটি বাইট নিতে পারে)। এটি ভ্রচারের জন্য এক মিলিয়ন টেবিলের জন্য প্রায় 1 জিবি। কেবল এটি অপ্রয়োজনীয় স্মৃতিচারণের কারণ নয়, এটি ডিস্কে সঞ্চালিত ক্রিয়াকলাপকে উত্সাহিত করতে পারে, এটি সম্ভবত কয়েক হাজার বার হ্রাস করে। এর সবগুলি তার সংজ্ঞায়িত ডেটা ধরণের (সামগ্রীতে স্বতন্ত্রভাবে) দুর্বল নির্বাচনের কারণে।

ইনোডিবি-র জন্যও এর কিছু পরিণতি রয়েছে। সূচকের আকার 3072 বাইট এবং একক কলাম সূচী 767 বাইট * এ সীমাবদ্ধ। সুতরাং, এটি সম্ভবত সম্ভবত আপনি কোনওVARCHAR(255) ক্ষেত্র সম্পূর্ণরূপে সূচী করতে সক্ষম হবেন না (ধরে নেওয়া হচ্ছে আপনি utf8 বা অন্য কোনও পরিবর্তনশীল দৈর্ঘ্য-এনকোডিং ব্যবহার করছেন)।

অধিকন্তু, ইনোডিবি-র সর্বাধিক ইনলাইন সারি আকারটি অর্ধেক পৃষ্ঠা (প্রায় 8000 বাইট), এবং বিএলএব বা বার্চারের মতো চলক-দৈর্ঘ্য ক্ষেত্রগুলি, যদি তারা অর্ধ পৃষ্ঠায় ফিট না করে তবে অফ-পৃষ্ঠে সংরক্ষণ করা যেতে পারে । পারফরম্যান্সে এর কিছু পরিণতি রয়েছে (কখনও কখনও ভাল, কখনও কখনও খারাপ, ব্যবহারের উপর নির্ভর করে) যা এড়ানো যায় না। এটি কমপ্যাক্ট এবং ডায়ানামিক ফর্ম্যাটের মধ্যে কিছুটা অদ্ভুততার কারণ হয়েছিল। উদাহরণস্বরূপ দেখুন: ত্রুটি 1118: সারির আকারটি খুব বড়। utf8 ইন্নাডব

সর্বশেষে তবে কমপক্ষে, যেমনটি @ পিপারকিউব আমাকে স্মরণ করিয়ে দিয়েছে, আপনি ব্যবহার করছেন এমনকি দৈর্ঘ্যের জন্য আরও 1 বাইটের প্রয়োজন হতে পারে VARCHAR(255), কারণ সংজ্ঞাটি অক্ষরে রয়েছে, এবং দৈর্ঘ্যটি বাইট সংরক্ষণ করে। উদাহরণস্বরূপ REPEAT('ñ', 255)utf8 এ 2 ^ 255 বাইটের বেশি রয়েছে, সুতরাং এটির দৈর্ঘ্য সংরক্ষণের জন্য 1 বাইটের বেশি প্রয়োজন হবে:

mysql> SELECT LENGTH(REPEAT('ñ', 255));
+---------------------------+
| LENGTH(REPEAT('ñ', 255))  |
+---------------------------+
|                       510 |
+---------------------------+
1 row in set (0.02 sec)

mysql> SELECT CHAR_LENGTH(REPEAT('ñ', 255));
+--------------------------------+
| CHAR_LENGTH(REPEAT('ñ', 255))  |
+--------------------------------+
|                            255 |
+--------------------------------+
1 row in set (0.00 sec)

সুতরাং পরামর্শের সাধারণ অংশটি হ'ল সম্ভব সবচেয়ে ছোট প্রকারটি ব্যবহার করা , কারণ এটি সম্ভবত অন্যথায় কার্য সম্পাদন বা পরিচালনার সমস্যা তৈরি করতে পারে। একটি VARCHAR(100)বেশী ভালো VARCHAR(255)(যদিও একটি VARCHAR(20)ভাল হবে), এমনকি যদি আপনি সঠিক দৈর্ঘ্য জানি না। রক্ষণশীল হওয়ার চেষ্টা করুন কারণ, টেবিলটি খুব বড় না হলে আপনি পরে সর্বদা সংজ্ঞাটি পরিবর্তন করতে পারেন।

আপডেট: কারণ পরিবর্তনশীল দৈর্ঘ্যের স্ট্রিংগুলির বিস্ফোরক জনপ্রিয়তা, উদাহরণস্বরূপ, ইমোজিস ব্যবহারের সাথে, ওরাকল সেই ক্ষেত্রে উন্নত পারফরম্যান্সের দিকে চাপ দিচ্ছে। সর্বশেষতম মাইএসকিউএল সংস্করণে (৫..6, ৫.7) ইনোএনডিবি আন্তঃব্যক্তিক এবং স্পষ্টত অস্থায়ী উভয় টেবিলের জন্য ডিফল্ট ইঞ্জিন হিসাবে সেট করা হয়েছে যার অর্থ চলক দৈর্ঘ্যের ক্ষেত্রগুলি এখন প্রথম শ্রেণির নাগরিক। এর অর্থ হ'ল খুব সীমিত চরিত্রের দৈর্ঘ্যের কম কারণ থাকতে পারে (তবে তারা এখনও বিদ্যমান)।

(*) দ্বিতীয় আপডেট : লার্জ_প্রিফিক্স_আইএনডেক্স এখন সর্বশেষতম মাইএসকিউএল সংস্করণে (8.0) ডিফল্টরূপে সক্ষম হয়েছে, তবে এটি এখনও পুরানো সংস্করণগুলির ক্ষেত্রে সত্য বা আপনি যদি লেগ্যাসি ইনোডাব ফাইল / সারি ফর্ম্যাটগুলি (গতিশীল বা সংকীর্ণ ব্যতীত) ব্যবহার করছেন তবে এখন ডিফল্টরূপে, একক কলাম সূচিগুলি সেই 3072 বাইট পর্যন্ত হতে পারে।


ছোট আপডেট: মাইএসকিউএল -8.0.13 + টেম্প টেবিলগুলির জন্য ডিফল্টরূপে টেম্পটেবল ব্যবহার করে যার ভার্চারগুলির জন্য দক্ষ সঞ্চয়স্থান রয়েছে।
Danblack

0

1-বনাম 2-বাইট উপসর্গটি ভুলে যান VARCHARs

  • এটি একটি বিয়োগ পরিমাণ দ্বারা কর্মক্ষমতা প্রভাবিত করে।
  • এটি "2" প্রায়শই সুস্পষ্ট নিয়মের চেয়ে বেশি বলে।

255 সম্পর্কে প্রশ্নটি বহুবার জিজ্ঞাসা করা হয়েছে এবং উত্তর দেওয়া হয়েছে।

  • অনেক দীর্ঘ VARCHARsসময় ব্যর্থতা হতে পারে CREATE TABLE
  • টেম্প টেবিল পরিণত হতে পারে MEMORYসঙ্গে, টেবিল VARCHARsপরিণত VARCHAR। এর অর্থ, উদাহরণস্বরূপ, এটি VARCHAR(255) CHARACTER SET utf8mb41020 বাইটের একটি নির্দিষ্ট দৈর্ঘ্য চায়। (এটি ব্যর্থ হবে, এবং এটি মাইআইএসএএম ব্যবহারে অধঃপতিত হবে))

নীচের লাইন: অন্ধভাবে 255 (বা 256) ব্যবহার করবেন না; স্কিমার জন্য যা বোঝায় তা করুন।

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