স্থির আকারের ক্ষেত্রে CHAR বনাম VARCHAR ব্যবহারের পারফরম্যান্স প্রভাবটি কী?


58

আমার একটি সূচিযুক্ত কলাম রয়েছে যা একটি MD5 হ্যাশ সঞ্চয় করে। সুতরাং, কলামটি সর্বদা 32-অক্ষরের মান সঞ্চয় করে। যে কারণেই হোক না কেন, এটি একটি চরের পরিবর্তে বার্চর হিসাবে তৈরি করা হয়েছিল। এটি ডাটাবেসটিকে একটি চরে রূপান্তর করতে মাইগ্রেট করার সমস্যাটি কী উপযুক্ত? এটি মাইএসকিউএল 5.0 এ ইনোডিবি এর সাথে রয়েছে।


6
সতর্কতা এই প্রশ্ন এবং এর উত্তরগুলি InnoDB এর আগে লেখা হয়েছিল এবং utf8 ডিফল্ট ছিল।
রিক জেমস

উত্তর:


56

এর আগেও অনুরূপ প্রশ্ন করা হয়েছিল

মাইএসকিউএল ভোরচার আকারের পারফরম্যান্সের প্রভাব lic

এখানে আমার উত্তরের অংশটি দেওয়া হল

আপনাকে অবশ্যই CHAR বনাম VARCHAR ব্যবহারের ট্রেড অফগুলি বুঝতে হবে

CHAR ক্ষেত্রের সাথে, আপনি যা বরাদ্দ করেন তা হ'ল যা আপনি পান। উদাহরণস্বরূপ, CHAR (15) 15 বাইট বরাদ্দ করে এবং সঞ্চয় করে, আপনি ক্ষেত্রের মধ্যে যতগুলি অক্ষর রাখেন তা নির্বিশেষে। স্ট্রিং ম্যানিপুলেশন সহজ এবং সোজা, যেহেতু ডেটা ক্ষেত্রের আকার সম্পূর্ণ অনুমানযোগ্য।

VARCHAR ক্ষেত্রগুলির সাথে, আপনি একটি সম্পূর্ণ আলাদা গল্প পাবেন। উদাহরণস্বরূপ, ভোরচার (১৫) আসলে ডাইনামিকভাবে 16 বাইট অবধি, ডেটার জন্য 15 অবধি এবং কমপক্ষে 1 অতিরিক্ত বাইট উপাত্তের দৈর্ঘ্য সংরক্ষণ করার জন্য বরাদ্দ করে। স্ট্রিংটিতে 'হ্যালো' স্টোর থাকলে that বাইট লাগবে, ৫ টি নয় St স্ট্রিং ম্যানিপুলেশন সর্বদা সব ক্ষেত্রে দৈর্ঘ্য পরীক্ষার কিছু ফর্ম করা উচিত।

আপনি দুটি কাজ করার সময় ট্রেডঅফটি আরও স্পষ্ট হয়: ১ লক্ষ বা বিলিয়ন বিলিয়ন সারিগুলি সংরক্ষণ করা 2. ইনচারেক্সিং কলামগুলি যা হয় চার্চ বা ভ্রচারের হয়

TRADEOFF # 1 স্পষ্টতই, ভেরচারের সুবিধা রয়েছে যেহেতু ভেরিয়েবল-দৈর্ঘ্যের ডেটা আরও কম সারি তৈরি করে এবং এভাবে ছোট ছোট শারীরিক ফাইল তৈরি করে।

TRADEOFF # 2 যেহেতু CHAR ক্ষেত্রগুলিকে স্থির ক্ষেত্রের প্রশস্ততার কারণে কম স্ট্রিং ম্যানিপুলেশন প্রয়োজন, CHAR ক্ষেত্রের বিপরীতে সূচী প্রদর্শনগুলি ভিউচারার ক্ষেত্রের তুলনায় গড়ে ২০% দ্রুত। এটি আমার পক্ষে কোনও অনুমান নয়। এটি প্রমাণ করার জন্য মাইএসকিউএল ডেটাবেস ডিজাইন এবং টিউনিং বইটি মাইআইএসএএম টেবিলে দুর্দান্ত কিছু সম্পাদন করেছে। বইয়ের উদাহরণ নীচের মত কিছু করেছে:

ALTER TABLE tblname ROW_FORMAT=FIXED;

এই নির্দেশিকাটি সমস্ত ভ্রচারকে চর হিসাবে আচরণ করতে বাধ্য করে। আমি 2007 সালে ফিরে আমার আগের কাজটিতে এটি করেছি এবং একটি 300 গিগাবাইট টেবিল নিয়েছি এবং অন্য কোনও পরিবর্তন ছাড়াই 20% দ্বারা সূচী দর্শনগুলি বাড়িয়েছি। এটি প্রকাশিত হিসাবে কাজ করে। তবে এটি প্রায় দ্বিগুণ আকারের একটি টেবিল তৈরি করেছিল, তবে এটি কেবল ট্রেড অফ # 1 এ ফিরে যায়।

মাইএসকিউএল কলাম সংজ্ঞায়নের জন্য কী প্রস্তাব দেয় তা দেখতে আপনি সংরক্ষণ করা ডেটা বিশ্লেষণ করতে পারেন। যে কোনও টেবিলের বিরুদ্ধে কেবল নিম্নলিখিতটি চালান:

SELECT * FROM tblname PROCEDURE ANALYSE();

এটি পুরো টেবিলটি অতিক্রম করবে এবং এতে থাকা ডেটা, ন্যূনতম ক্ষেত্রের মান, সর্বাধিক ক্ষেত্রের মান এবং আরও কিছু উপর ভিত্তি করে প্রতিটি কলামের জন্য কলাম সংজ্ঞা প্রস্তাব করবে। কখনও কখনও, আপনাকে কেবল CHAR বনাম VARCHAR পরিকল্পনা করার সাথে সাধারণ জ্ঞান ব্যবহার করতে হবে। এখানে একটি ভাল উদাহরণ:

আপনি যদি আইপি ঠিকানাগুলি সঞ্চয় করে থাকেন তবে এই জাতীয় কলামের মুখোশ সর্বাধিক 15 টি অক্ষর (xxx.xxx.xxx.xxx)। আমি CHAR(15)হৃৎস্পন্দনে ডানদিকে ঝাঁপিয়ে পড়ব কারণ আইপি অ্যাড্রেসের দৈর্ঘ্য এত বেশি হবে না এবং অতিরিক্ত বাইট দ্বারা নিয়ন্ত্রিত স্ট্রিং ম্যানিপুলেশনের যুক্ত জটিলতা। আপনি এখনও এই PROCEDURE ANALYSE()জাতীয় কলামের বিরুদ্ধে একটি করতে পারেন । এটি এমনকি VARCHAR সুপারিশ করতে পারে। আমার অর্থ এই মুহুর্তে ভ্রচারের তুলনায় CHAR এ থাকবে।

CHAR বনাম VARCHAR সমস্যাগুলি কেবল সঠিক পরিকল্পনার মাধ্যমে সমাধান করা যেতে পারে be দুর্দান্ত শক্তির সাথে আসে মহান দায়িত্ব (ক্লিচ তবে সত্য)।

হালনাগাদ

যখন এমডি 5 এর কথা আসে, strlenসম্পূর্ণ সারি বিন্যাসটি স্যুইচ করার সময় অভ্যন্তরীণভাবে গণনাটি বাদ দেওয়া উচিত। মাঠ সংজ্ঞা পরিবর্তন করার প্রয়োজন হবে না।

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


1
আমি মনে করি আমি কোনও আইপি ঠিকানার জন্য একটি চর (4) বা স্বাক্ষরবিহীন পূর্ণসংখ্যার মতো কিছু ব্যবহার করব
জ্যাক ডগলাস

@ জ্যাকপিডুগলাস আপনি সেই মুহূর্তে সঠিক আছেন।
রোল্যান্ডোমাইএসকিউএলডিবিএ

সূচিগুলি কি কোনও স্থির দৈর্ঘ্যের সাথে সঞ্চিত নয়? স্থির দৈর্ঘ্যের উন্নত সূচক লকআপগুলিতে স্টোরেজ ফর্ম্যাটটি কীভাবে পরিবর্তন করা যায় তা আমি পাই না। আপনি কি টেবিল স্ক্যানগুলি উন্নত করতে চান?
মার্কাস অ্যাডামস 22

1
@ জ্যাকডুগলাস, কেন bitএবং না binary?
পেসারিয়ার

@ পেসিয়ার যা আরও ভাল হবে, আমি তাতে রাজি আছি :)
জ্যাক ডগলাস

19

দেখে মনে হচ্ছে আপনি প্রতি মান 1 বাইট বা একটি রূপান্তর করে প্রায় 3% সংরক্ষণ করবেন char। সম্ভবত আপনি এমডি 5 হেক্সে স্টোরেজ করে রাখছেন যদি আপনি তার binaryপরিবর্তে এটি ব্যবহার করে 50% সঞ্চয় করতে পারেন তবে এটি মূল্যবান নয় ।

ওভয়েসকে ধন্যবাদ (মন্তব্য দেখুন) যদি আপনি একটি মাল্টিবাইট চরিত্রের সেটটি ব্যবহার করেন তবে 32 বাইটের বেশি ব্যবহারchar(32) করতে পারে poin

unhexহেক্স স্ট্রিংটিকে বাইনারি রূপান্তর করতে আপনার ফাংশনটি ব্যবহার করা উচিত বলে উল্লেখ করার জন্য রিক জেমসকে ধন্যবাদ :

create table foo(bar varbinary(100));
insert into foo(bar) values(md5('a')); 
insert into foo(bar) values(unhex(md5('a'))); 
select length(bar) from foo;
| দৈর্ঘ্য (বার) |
| ----------: |
| 32 |
| 16 |

ডিবি <> ফিডল এখানে


বাইনারি পরিবর্তন করার জন্য ভাল কল।
টোমাস

আমি এটি বাইনারি রূপান্তর করার পরিকল্পনা করছি। এখন যদিও আমি এটি সম্পর্কে চিন্তা করি, তবে আমার এনকোডিং utf-8 হওয়ায় আমি বাইট বা চর ব্যবহার করছি কিনা তার ভিত্তিতে আকারটি কোনও আলাদা হওয়া উচিত নয়। নাকি আমি ভুল করছি?
জেসন বাকের

@ জেসন - এনকোডিং এর ক্ষেত্রে প্রযোজ্য না binary- অথবা আমি ভুল বুঝেছি?
জ্যাক ডগলাস

3
utf-8 এর একটি অক্ষর সেট সহ একটি চর (32) কলামের জন্য, প্রতিটি মান স্টোরেজের জন্য 32x3 বাইটের প্রয়োজন হবে। আপনাকে কেন MD5 হ্যাশ মান utf-8 সেট করতে হবে। বাইনারি (32) এ রূপান্তর করতে মান অনুযায়ী 32 বাইট লাগবে।
ovais.tariq

1
BINARYআপনি যদি ব্যবহার না করেন তবে পরিবর্তন খুব অল্প করে UNHEX()। এটি, আপনি স্টোরের UNHEX(MD5(x))মধ্যে BINARY(16)উল্লেখযোগ্য স্থান সংরক্ষণ করতে 16-বাইটে সঞ্চয় MD5(x)করতে পারেন CHAR(32) CHARACTER SET ascii
রিক জেমস

15

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

http://dev.mysql.com/doc/refman/5.0/en/char.html

উপরে বর্ণিত ডকুমেন্টেশনের প্রথম মন্তব্যটিও নোট করুন ... "পুরো রেকর্ডটি নির্দিষ্ট আকারের আকারে থাকলে CHAR কেবল আপনার অ্যাক্সেসকে গতিময় করবে That অর্থাৎ, আপনি যদি কোনও ভেরিয়েবল সাইজের অবজেক্ট ব্যবহার করেন তবে আপনি সেগুলিও তৈরি করতে পারেন ভেরিয়েবলের আকার a


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