আইএনটি এবং ভোরচার প্রাথমিক কীগুলির মধ্যে বাস্তব পারফরম্যান্সের পার্থক্য রয়েছে?


174

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

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

সুতরাং, কারও কি এই বিশেষ ব্যবহারের ক্ষেত্রে এবং এর সাথে সম্পর্কিত পারফরম্যান্স উদ্বেগ নিয়ে অভিজ্ঞতা আছে?


3
আমি যে পরীক্ষা চালিয়েছি তার কিছু বিশদ সহ "না" উত্তর দিয়ে একটি পোস্ট তৈরি করেছি ... তবে এটি এসকিউএল সার্ভার ছিল, মাইএসকিউএল নয়। তাই আমি আমার উত্তরটি মুছলাম।
টিমোথি খৌরি 21

17
@ টিমোথি - আপনার এটি মুছে ফেলা উচিত হয়নি। আমি এটিকে ভোট দেওয়ার প্রক্রিয়াতে ছিলাম। বেশিরভাগ এসকিউএল ডাটাবেস সার্ভারের অনুরূপ ক্যোয়ারী পরিকল্পনাকারী এবং অনুরূপ কর্মক্ষমতা বাধা রয়েছে।
পল টমবলিন 21

9
@ টিমোথি দয়া করে আপনার ফলাফলগুলি পুনরায় পোস্ট করুন।
জ্যাক ম্যাকগ্রা

2
এতগুলি মন্তব্য এবং উত্তর ধরে নিয়েছে যে যোগদানের জন্য কীগুলি রয়েছে। তারা না. ডাবলিকেট সারিগুলি এড়াতে, (একই সত্তার প্রতিনিধিত্বকারী একাধিক সারি) - ডেটা ধারাবাহিকতার জন্য কীগুলি রয়েছে। যে কোনও কলাম (বা কলামগুলির সেট) একটি যোগদানের জন্য ব্যবহার করা যেতে পারে এবং গ্যারান্টিটি যোগ করতে যে এক থেকে শূন্য বা অনেকগুলি কলাম [গুলি] কেবল অনন্য হওয়া দরকার। যে কোনও অনন্য সূচি গ্যারান্টি দেয় এবং এটি অর্থবহ হওয়ার দরকার নেই।
চার্লস বেতানা

উত্তর:


78

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

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

আপনার ডাটাবেসে সমস্ত টেবিলের জন্য কৌশল ব্যবহার করবেন না। সম্ভবতঃ কিছু ক্ষেত্রে প্রাকৃতিক চাবি আরও ভাল, তবে অন্য ক্ষেত্রে একটি সারোগেট কী আরও ভাল।

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


3
এবং কখনও কখনও, (imho, প্রায়শই), উভয়ই ভাল, অন্যান্য টেবিলগুলিতে এফকে রেফারেন্সের জন্য ব্যবহারের জন্য সার্গেট, এবং
যোগদানের

পছন্দ করুন এফকে পাশাপাশি উপাত্তের ধারাবাহিকতার জন্য একটি প্রাকৃতিক কী ব্যবহার করা একটি সাধারণ অনুশীলন? আমার প্রথম চিন্তা ছিল যে বড় টেবিলগুলিতে অতিরিক্ত স্টোরেজ প্রয়োজন হবে এটি উপযুক্তভাবে না তৈরি করতে পারে। কোন তথ্য প্রশংসা করা হয়। এফওয়াইআই - আমার একটি শালীন প্রোগ্রামিং ব্যাকগ্রাউন্ড আছে তবে আমার এসকিউএল অভিজ্ঞতা বেশিরভাগ স্বেচ্ছাসেবী অনুসন্ধানে সীমাবদ্ধ
রব

2
@ চার্লসব্রেটানা যখন আমি "এগুলি উভয়কেই সঞ্চয় করি" পড়ি, তখন আমার মনে হয় "রিডানডেন্সি" এবং "নরমালাইজড নয়" এর সমান, "এই জিনিসগুলি বদলে যেতে পারে" এবং "আমাকে নিশ্চিত করতে হবে যে যদি কোনওটি পরিবর্তিত হয় তবে উভয়ই বদলে যায়"। আপনার যদি রিডানডেন্সি থাকে তবে একটি খুব ভাল কারণ থাকতে হবে (সম্পূর্ণ অগ্রহণযোগ্য পারফরম্যান্সের মতো) কারণ অতিরিক্তভাবে আপনার ডেটা অসম্পূর্ণ হওয়ার সম্ভাবনা থাকে।
jpmc26

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

1
এবং আপনার অন্যান্য প্রশ্নের উত্তর দেওয়ার জন্য, বিশেষত রাজ্যের টেবিলের বিষয়ে, যদি মান সহ এই টেবিলে একটি সরোগেট কী থাকে তবে বলুন, 1 থেকে 50 টি ফ্রপম, তবে আপনি রাষ্ট্রের ডাক কোডে অন্য কোনও অনন্য সূচক বা কী রাখেন নি, (এবং, আমার মতে, রাষ্ট্রের নাম হিসাবেও), তবে একই ডাক কোড এবং / অথবা রাষ্ট্রের নাম সহ আলাদা আলাদা সার্গেট কী মান সহ কাউকে দুটি সারি প্রবেশ করা থেকে বাধা দেওয়ার কী আছে? 'এনজে', 'নিউ জার্সি' দিয়ে দুটি সারি থাকলে ক্লায়েন্ট অ্যাপ কীভাবে এটি পরিচালনা করবে? প্রাকৃতিক কীগুলি তথ্যের ধারাবাহিকতা নিশ্চিত করে!
চার্লস ব্রেটানা 21

81

এটি পারফরম্যান্স সম্পর্কে নয়। এটি একটি ভাল প্রাথমিক কী কী করে তা সম্পর্কে। সময়ের সাথে সাথে অনন্য এবং অপরিবর্তনীয়। আপনি মনে করতে পারেন যে কোনও দেশের কোডের মতো কোনও সত্তা সময়ের সাথে কখনই পরিবর্তন হয় না এবং এটি একটি প্রাথমিক কীটির জন্য ভাল প্রার্থী হবে। তবে তিক্ত অভিজ্ঞতা হ'ল খুব কমই।

আইএনটি অটোপ্রেসমেন্ট "সময়ের সাথে অনন্য এবং অপরিবর্তনীয়" শর্তটি পূরণ করে। অতএব পছন্দ।


25
সত্য। আমার সবচেয়ে বড় একটি ডাটাবেসে যুগোস্লাভিয়া এবং সোভিয়েত ইউনিয়নের প্রবেশ রয়েছে। আমি খুশি যে তারা প্রাথমিক কী নয়।
পল টমবলিন 21

8
@ স্টিভ, তবে কেন এএনএসআই এসকিউএল ওপেন ক্যাসকেডের জন্য সিনট্যাক্স সমর্থন করে?
বিল কারভিন 0

5
অপরিচ্ছন্নতা একটি চাবি প্রয়োজন হয় না। যাইহোক, সারোগেট কীগুলি কখনও কখনও খুব পরিবর্তন হয়। আপনার প্রয়োজন হলে কীগুলি পরিবর্তন করার সাথে কোনও ভুল নেই।
nvogel

9
পল, আপনি কি আপনার ডাটাবেসে সোভিয়েত ইউনিয়নকে রাশিয়ায় পরিবর্তন করেছেন? এবং ভান করে যে এসইউ কখনই থাকে না? এবং এসইউর সমস্ত রেফারেন্স এখন রাশিয়ার দিকে ইঙ্গিত করে?
ডেইনিয়াস

6
@ এলগা আমি এসইউতে জন্মগ্রহণ করেছি তাই এটি কী তা আমি জানি।
ডেইনিয়াস

52

এই অনলাইনের জন্য মানদণ্ডের অভাব থেকে আমি কিছুটা বিরক্ত হয়েছিলাম, তাই আমি নিজেই একটি পরীক্ষা চালিয়েছিলাম।

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

সেটআপটি নিম্নরূপ ছিল:

  • ইন্টেল কোর ™ i7-7500U সিপিইউ @ 2.70GHz × 4
  • 15.6 জিআইবি র‌্যাম, যার মধ্যে আমি পরীক্ষার সময় প্রায় 8 জিবি নিখরচায় নিশ্চিত করেছিলাম।
  • 148.6 গিগাবাইট এসএসডি ড্রাইভ, প্রচুর পরিমাণে মুক্ত স্থান সহ।
  • উবুন্টু 16.04 64-বিট
  • মাইএসকিউএল ভার 14.14 লিনাক্সের জন্য 5.7.20 ডিস্ট্রিবিউট করুন (x86_64)

টেবিলগুলি:

create table jan_int (data1 varchar(255), data2 int(10), myindex tinyint(4)) ENGINE=InnoDB;
create table jan_int_index (data1 varchar(255), data2 int(10), myindex tinyint(4), INDEX (myindex)) ENGINE=InnoDB;
create table jan_char (data1 varchar(255), data2 int(10), myindex char(6)) ENGINE=InnoDB;
create table jan_char_index (data1 varchar(255), data2 int(10), myindex char(6), INDEX (myindex)) ENGINE=InnoDB;
create table jan_varchar (data1 varchar(255), data2 int(10), myindex varchar(63)) ENGINE=InnoDB;
create table jan_varchar_index (data1 varchar(255), data2 int(10), myindex varchar(63), INDEX (myindex)) ENGINE=InnoDB;

তারপরে, আমি পিএইচপি স্ক্রিপ্ট দিয়ে প্রতিটি টেবিলের মধ্যে 10 মিলিয়ন সারি পূরণ করেছি যার সারমর্মটি এর মতো:

$pdo = get_pdo();

$keys = [ 'alabam', 'massac', 'newyor', 'newham', 'delawa', 'califo', 'nevada', 'texas_', 'florid', 'ohio__' ];

for ($k = 0; $k < 10; $k++) {
    for ($j = 0; $j < 1000; $j++) {
        $val = '';
        for ($i = 0; $i < 1000; $i++) {
            $val .= '("' . generate_random_string() . '", ' . rand (0, 10000) . ', "' . ($keys[rand(0, 9)]) . '"),';
        }
        $val = rtrim($val, ',');
        $pdo->query('INSERT INTO jan_char VALUES ' . $val);
    }
    echo "\n" . ($k + 1) . ' millon(s) rows inserted.';
}

জন্য intটেবিল, বিট ($keys[rand(0, 9)])শুধু প্রতিস্থাপন করা হয়েছে rand(0, 9), এবং varcharটেবিল, আমি পূর্ণ অঙ্গরাজ্য নাম ব্যবহার করা হয়, কাটিং বা তাদের 6 অক্ষর পর্যন্ত বিস্তৃত ছাড়া।generate_random_string()একটি 10-বর্ণের এলোমেলো স্ট্রিং উত্পন্ন করে।

তারপরে আমি মাইএসকিউএল চালিয়েছিলাম:

  • SET SESSION query_cache_type=0;
  • জন্য jan_intটেবিল:
    • SELECT count(*) FROM jan_int WHERE myindex = 5;
    • SELECT BENCHMARK(1000000000, (SELECT count(*) FROM jan_int WHERE myindex = 5));
  • অন্যান্য সারণী, উপরে হিসাবে একই সঙ্গে, জন্য myindex = 'califo'জন্য charটেবিল ও myindex = 'california'জন্য varcharটেবিল।

দ্য টাইমস অফ BENCHMARKপ্রতিটি টেবিলের উপর ক্যোয়ারী:

  • জান_িন্ট: 21.30 সেকেন্ড
  • jan_int_index: 18.79 সেকেন্ড
  • জান_চর: 21.70 সেকেন্ড
  • jan_char_index: 18.85 সেকেন্ড
  • জান_ওয়ারচর: 21.76 সেকেন্ড
  • জান_ওয়ারচর_আইডেক্স: 18.86 সেকেন্ড

সারণী ও সূচী আকারগুলির বিষয়ে, এখানে show table status from janperformancetest;(ডাব্লু / কয়েকটি কলাম দেখানো হয়নি):

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Name              | Engine | Version | Row_format | Rows    | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Collation              |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| jan_int           | InnoDB |      10 | Dynamic    | 9739094 |             43 |   422510592 |               0 |            0 |   4194304 |           NULL | utf8mb4_unicode_520_ci |  
| jan_int_index     | InnoDB |      10 | Dynamic    | 9740329 |             43 |   420413440 |               0 |    132857856 |   7340032 |           NULL | utf8mb4_unicode_520_ci |   
| jan_char          | InnoDB |      10 | Dynamic    | 9726613 |             51 |   500170752 |               0 |            0 |   5242880 |           NULL | utf8mb4_unicode_520_ci |  
| jan_char_index    | InnoDB |      10 | Dynamic    | 9719059 |             52 |   513802240 |               0 |    202342400 |   5242880 |           NULL | utf8mb4_unicode_520_ci |  
| jan_varchar       | InnoDB |      10 | Dynamic    | 9722049 |             53 |   521142272 |               0 |            0 |   7340032 |           NULL | utf8mb4_unicode_520_ci |   
| jan_varchar_index | InnoDB |      10 | Dynamic    | 9738381 |             49 |   486539264 |               0 |    202375168 |   7340032 |           NULL | utf8mb4_unicode_520_ci | 
|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|

আমার উপসংহারটি হল যে এই বিশেষ ব্যবহারের ক্ষেত্রে কোনও পারফরম্যান্সের পার্থক্য নেই।


আমি জানি এখনই দেরি হয়ে গেছে, তবে আপনি যদি সেই অবস্থার জন্য কম আদর্শ স্ট্রিং বেছে নিয়ে থাকেন তবে ফলাফলগুলি দেখতে আগ্রহী হয়ে উঠতাম। "ক্যালিফো [রিনিয়া]" আদর্শ ছিল কারণ এটি প্রথম চরিত্রের সাথে তুলনা করার পরে অমিলটি বাতিল করতে পারে, কেবল আসল ম্যাচগুলিতে আরও পরীক্ষা করা প্রয়োজন; "নিউহ্যাম" এর মতো আরও কিছু আকর্ষণীয় ফলাফল দেয় কারণ সমস্ত মিল না থেকে দূরে রাখতে আরও চরিত্রের তুলনা করা নতুন। এছাড়াও, আপনার পূর্ণসংখ্যাগুলি সেভাবে সীমাবদ্ধ করা তাদের বিরুদ্ধে প্রতিকূলতাকেও সীমাবদ্ধ করে রাখে, আমি তাদের কমপক্ষে ২ 26 টি মান দিতে পারি।
Uueerdo

15
আশ্চর্যজনক যে 10 বছরের পুরানো প্রশ্নে, এটি দুটি উত্তরগুলির মধ্যে একটি মাত্র যা অনুমান নয় এবং প্রকৃত মানদণ্ডের উপর নির্ভর করে।
অ্যাড্রিয়ান বাকের

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

1
@ মেলকোর ফেয়ার পয়েন্ট যা আমি এর INDEXপরিবর্তে ব্যবহার করি PRIMARY KEY। আমি আমার যুক্তি মনে রাখছি না - আমি সম্ভবত ধরে নিয়েছি স্বাতন্ত্র্য সীমাবদ্ধতার সাথে PRIMARY KEYএকটি মাত্র INDEX। তবে, ফেডেরিকো- razzoli.com/primary-key-in-innodb- এ কীভাবে জিনিসগুলি InnoDB- এ সংরক্ষণ করা হয়েছে সে বিভাগটি পড়ে আমি মনে করি যে আমার ফলাফলগুলি এখনও প্রাথমিক কীগুলিতে প্রয়োগ হয় এবং মান অনুসন্ধানের পারফরম্যান্সের পার্থক্য সম্পর্কে প্রশ্নের উত্তর দেয়। এছাড়াও, আপনার মন্তব্যটি অ্যালগরিদমগুলি বাছাইয়ের পারফরম্যান্সের দিকে তাকানোর পরামর্শ দেয় , যা আমার তদন্ত করা ব্যবহারের ক্ষেত্রে প্রযোজ্য না, যা একটি সেটে মানগুলি দেখছে
জানু owsঙ্কোভস্কি

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

38

দৈর্ঘ্যের উপর নির্ভর করে .. যদি বার্চারটি 20 টি অক্ষর হয় এবং 4 টি হয়, তবে আপনি যদি কোন int ব্যবহার করেন, আপনার সূচকে ডিস্কে সূচক স্পেসের পৃষ্ঠায় প্রতি নোডের চেয়ে পাঁচগুণ বেশি হবে ... তার মানে ট্র্যাভারিং সূচকের জন্য অনেকগুলি শারীরিক এবং / অথবা যৌক্তিক পাঠের এক পঞ্চম প্রয়োজন হবে ..

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

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

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


নিশ্চিত? সর্বাধিক ডেটা ফর্ম্যাট সারি ভিত্তিক? কীগুলি বাদে অন্য ডেটা রয়েছে। আইএনএস ফ্যাক্টর 5 ইউটোপিক?
ম্যানুয়েলস্কিনিড 3 ই

1
@ manuelSchneid3r, কি? utopic? না, 5 গুণকটি "ইউটোপিক" নয়। এটি মাত্র 20 দ্বারা 4 বিভক্ত এবং এবং "ডেটা ফর্ম্যাট সারি ভিত্তিক" এর অর্থ কী? সূচকগুলি "সারি ভিত্তিক" নয়, তারা সুষম গাছের কাঠামো।
চার্লস ব্রেটানা

36

একেবারে না.

আমি বেশ কয়েকটি ... বেশ কয়েকটি ... আইএনটি, ভিআরচারার এবং CHAR এর মধ্যে পারফরম্যান্স চেক করেছি।

একটি প্রাথমিক কী (10 টি) অনন্য এবং ক্লাস্টারযুক্ত 10 মিলিয়ন রেকর্ড সারণীতে ঠিক একই গতি এবং পারফরম্যান্স ছিল (এবং সাবট্রি ব্যয়) আমি যে তিনটি ব্যবহার করেছি তা বিবেচনা করেই।

যা বলা হচ্ছে ... আপনার অ্যাপ্লিকেশনটির জন্য যা ভাল তা ব্যবহার করুন। অভিনয় সম্পর্কে চিন্তা করবেন না।


42
ভার্চারগুলি কত দিন ছিল তা না জেনে অর্থহীন ... যদি সেগুলি 100 বাইট প্রশস্ত হয় তবে গ্যারান্টিযুক্ত আপনি 4 বাইট ইনটের মতো পারফরম্যান্স পাচ্ছেন না
চার্লস ব্রেটানা

6
আপনি কোন ডাটাবেসটি ব্যবহার করছেন এবং ডাটাবেসের কোন সংস্করণটি তা জানতে সহায়তা করবে। পারফরম্যান্স টিউনিং প্রায় সর্বদা কাজ করে এবং সংস্করণ থেকে সংস্করণে উন্নত হয়।
ডেভ ব্ল্যাক

সূত্রের আকারের জন্য অবশ্যই VARCHAR গুরুত্বপূর্ণ AR এবং সূচি মেমরিতে কতটা ফিট হতে পারে তা নির্ধারণ করে। এবং মেমরির সূচকগুলি এখনকার তুলনায় অনেক বেশি দ্রুত। এটি হতে পারে যে আপনার 10 মিটার সারিগুলির জন্য, আপনার সূচকটির জন্য 250MB মেমরি উপলব্ধ ছিল এবং ভাল ছিল। তবে আপনার যদি 100 মিটার সারি থাকে তবে আপনি সেই স্মৃতিতে কম থাকবেন।
পল ড্রাগন

9

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

কীগুলির মধ্যে আরও বিস্তৃত আকারের বৃহত টেবিলগুলির জন্য, এটি বিপজ্জনক হতে পারে। উদাহরণস্বরূপ কোনও ব্যবহারকারীর টেবিল থেকে ই-মেইল ঠিকানা / ব্যবহারকারীর নাম ব্যবহার করার বিষয়ে ভাবুন। আপনার কয়েক মিলিয়ন ব্যবহারকারী এবং সেগুলির মধ্যে কয়েকজনের দীর্ঘ নাম বা ইমেল ঠিকানা থাকলে কী হয়। এখন যে কোনও সময় এই কীটি ব্যবহার করে আপনার এই টেবিলটিতে যোগ দিতে হবে এটি আরও ব্যয়বহুল হয়ে যায়।


2
আপনি কি নিশ্চিত যে এটি ব্যয়বহুল হবে? নাকি আপনি শুধু অনুমান করছেন?
স্টিভ ম্যাকলিউড 21

অবশ্যই এটি আরডিবিএম বাস্তবায়নের উপর নির্ভর করে, তবে যা আমি বেশিরভাগ সার্ভারগুলি বুঝতে পারি তা থেকে সূচীকরণের উদ্দেশ্যে প্রকৃত মানটির হ্যাশ রাখে। তবুও, এমনকি এটি তুলনামূলকভাবে সংক্ষিপ্ত হ্যাশ (বলুন, 10 বাইট), এটি 2 4 বাইট আইটের চেয়ে 2 10 বাইট হ্যাশ তুলনা করা আরও কাজ।
জোয়েল কোহোর্ন 22

যোগদানের জন্য কখনও একটি দীর্ঘ (প্রশস্ত) কী ব্যবহার করুন না ... তবে এটি যদি সারণীতে সারিগুলির জন্য স্বতন্ত্র যা সর্বোত্তম উপস্থাপনা হয় তবে তারপরে আরও একটি অনন্য কী (বা সূচক - যা একই জিনিস) থাকতে পারে এই প্রাকৃতিক মান ব্যবহার টেবিল। যোগদানের জন্য কীগুলি নেই, আপনি আপনার হৃদয় যা কিছু ইচ্ছা তাতে কিছুতেই যোগ দিতে পারেন। ডেটা ধারাবাহিকতা নিশ্চিত করার জন্য কীগুলি রয়েছে।
চার্লস বেতানা

6

প্রাথমিক কী হিসাবে, শারীরিকভাবে যা কিছু সারি অনন্য করে তা প্রাথমিক কী হিসাবে নির্ধারণ করা উচিত।

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

সার্গেট ব্যবহারের ক্ষেত্রে ত্রুটিটি হ'ল আপনি সম্ভবত সারোগেটের অর্থ পরিবর্তনের অনুমতি দিতে পারবেন:

ex.
id value
1 A
2 B
3 C

Update 3 to D
id value
1 A
2 B
3 D

Update 2 to C
id value
1 A
2 C
3 D

Update 3 to B
id value
1 A
2 C
3 B

এটি আপনার কাঠামোর ক্ষেত্রে আপনাকে কী চিন্তিত করতে হবে এবং সবচেয়ে বেশি কী বোঝাতে হবে তার উপর নির্ভর করে।


3

একটি সরোগেট AUTO_INCREMENTব্যথা করে এমন সাধারণ ঘটনা :

একটি সাধারণ স্কিমা প্যাটার্ন হ'ল একাধিক থেকে বহু ম্যাপিং :

CREATE TABLE map (
    id ... AUTO_INCREMENT,
    foo_id ...,
    bar_id ...,
    PRIMARY KEY(id),
    UNIQUE(foo_id, bar_id),
    INDEX(bar_id) );

এই প্যাটার্নটির কার্যকারিতা আরও ভাল, বিশেষত ইনোডিবি ব্যবহার করার সময়:

CREATE TABLE map (
    # No surrogate
    foo_id ...,
    bar_id ...,
    PRIMARY KEY(foo_id, bar_id),
    INDEX      (bar_id, foo_id) );

কেন?

  • InnoDB মাধ্যমিক কীগুলির অতিরিক্ত অনুসন্ধান প্রয়োজন; জুটিকে পিকে-তে সরিয়ে দিয়ে এক দিকের জন্য এড়ানো যায়।
  • গৌণ সূচকটি "আচ্ছাদন", সুতরাং এটির অতিরিক্ত অনুসন্ধানের প্রয়োজন নেই।
  • এই টেবিলটি ছাড়িয়ে যাওয়ার idএবং এক সূচকের কারণে ছোট ।

আরেকটি কেস ( দেশ ):

country_id INT ...
-- versus
country_code CHAR(2) CHARACTER SET ascii

সবসময়ই নবজাতক INT'প্রাকৃতিক' 2-বাইট, প্রায় অপরিবর্তিত 2-বাইট স্ট্রিং ব্যবহার না করে দেশ_কোডকে 4-বাইটে স্বাভাবিক করে তোলে normal দ্রুততর, আরও ছোট, কম জোইন, আরও পঠনযোগ্য।


2

হাটলুক-এ, আমরা প্রাকৃতিক কীগুলি ব্যবহার করতে আমাদের অনেকগুলি সারণী পরিবর্তন করেছি। আমরা পারফরম্যান্সে একটি বাস্তব-বিশ্বের বৃদ্ধি অভিজ্ঞতা অর্জন করেছি। আপনি যেমন উল্লেখ করেছেন, আমাদের অনেকগুলি ক্যোয়ারী এখন কম যোগ দেয় যা প্রশ্নগুলিকে আরও পারফরম্যান্ট করে তোলে। এমনকি এটি একটি যৌগিক প্রাথমিক কী ব্যবহার করা হবে যদি তা বোঝা যায়। বলা হচ্ছে, কিছু টেবিলের সাথে সরোগেট কী থাকলে তা দিয়ে কাজ করা আরও সহজ।

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


2

আমি একই ধরণের সমস্যার মুখোমুখি হয়েছি। আমি 3 টি ফ্যাক্ট টেবিল, সড়ক দুর্ঘটনা, দুর্ঘটনায় যানবাহন এবং দুর্ঘটনায় হতাহতের সাথে একটি ডিডাব্লু (নক্ষত্রমণ্ডলীর স্কিমা) তৈরি করেছি। ডেটাতে 1979 থেকে 2012 পর্যন্ত যুক্তরাজ্যে রেকর্ডকৃত সমস্ত দুর্ঘটনা এবং 60 টি মাত্রার সারণী অন্তর্ভুক্ত রয়েছে। সব মিলিয়ে প্রায় 20 মিলিয়ন রেকর্ড।

বাস্তব সারণী সম্পর্ক:

+----------+          +---------+
| Accident |>--------<| Vehicle |
+-----v----+ 1      * +----v----+
     1|                    |1
      |    +----------+    |
      +---<| Casualty |>---+
         * +----------+ *

আরডিএমএস: মাইএসকিউএল 5.6

স্থানীয়ভাবে দুর্ঘটনা সূচকটি 15 টি সংখ্যার সহ একটি বর্ণচর (সংখ্যা এবং অক্ষর) is আমি সরোগেট কী না রাখার চেষ্টা করেছি, একবার দুর্ঘটনার সূচকগুলি কখনই বদলাবে না। একটি আই ((৮ টি কোর) কম্পিউটারে, মাত্রার উপর নির্ভর করে লোডের 12 মিলিয়ন রেকর্ড পরে ডিডাব্লু কোয়েরি করতে খুব ধীর হয়ে গেছে। প্রচুর পুনরায় কাজ করার পরে এবং বিগিন্ট সারোগেট কীগুলি যুক্ত করার পরে আমি গড়ে 20% গতির পারফরম্যান্স বুস্ট পেয়েছি। তবুও কম পারফরম্যান্স লাভ, তবে বৈধ চেষ্টা। আমি মাইএসকিউএল টিউনিং এবং ক্লাস্টারিংয়ে কাজ করছি।


1
পার্টিশনটি দেখার জন্য আপনার মতো লাগছে।
jcoffland

2

প্রশ্নটি মাইএসকিউএল সম্পর্কে তাই আমি বলি এখানে একটি উল্লেখযোগ্য পার্থক্য রয়েছে। যদি এটি ওরাকল সম্পর্কে ছিল (যা সংখ্যাকে স্ট্রিং হিসাবে সঞ্চয় করে - হ্যাঁ, আমি প্রথমে এটি বিশ্বাস করতে পারি না) তবে খুব বেশি পার্থক্য নেই।

সারণীতে সঞ্চয়স্থান ইস্যু নয় তবে আপডেট করা এবং সূচকের উল্লেখ করা refer এর প্রাথমিক কী এর উপর ভিত্তি করে রেকর্ড অনুসন্ধান করার সাথে সম্পর্কিত প্রশ্নগুলি প্রায়শই হয় - আপনি চান যে এগুলি যত তাড়াতাড়ি ঘটতে পারে কারণ এগুলি প্রায়শই ঘটে।

জিনিসটি সিপিইউতে 4 বাইট এবং 8 বাইট প্রাকৃতিকভাবে সিলিকনে ডিল করে । দুটি পূর্ণসংখ্যার তুলনা করা এটির পক্ষে খুব দ্রুত - এটি এক বা দুটি ঘড়ির চক্রে ঘটে।

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

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


0

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


0

যথারীতি, কোনও কম্বল উত্তর নেই। 'এটা নির্ভর করে!' এবং আমি সুন্দরী না। মূল প্রশ্নের আমার বোধগম্য ছোট টেবিলগুলির কীগুলির জন্য ছিল - যেমন দেশের (পূর্ণসংখ্যার আইডি বা চর / বার্চার কোড) অ্যাড্রেস / যোগাযোগের সারণীর মতো সম্ভাব্য বিশাল টেবিলের বিদেশী কী key

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

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

কোডগুলি আকারে ছোট হওয়ায় - সাধারণত দেশ এবং রাজ্যের জন্য 3 টির বেশি অক্ষর না থাকে, এই পরিস্থিতিতে প্রাকৃতিক কীগুলি বিদেশী কী হিসাবে ব্যবহার করা ঠিক হবে।

অন্যান্য দৃশ্য যেখানে কীগুলি দীর্ঘতর বর্ণচর মান এবং সম্ভবত বড় টেবিলের উপর নির্ভরশীল; surrogate কী সম্ভবত সম্ভবত সুবিধা আছে।


0

পারফরম্যান্সের সুযোগ বিবেচনায় রেখে (বাক্স সংজ্ঞার বাইরে): অবশ্যই হ্যাঁ বলার অনুমতি দিন:

1- সার্গেট ইন্ট ব্যবহার করা অ্যাপ্লিকেশনটিতে দ্রুততর কারণ আপনার কোডে বা আপনার ক্যোয়ারিতে আপনাকে টুপার (), টোলভার (), টুঅপারআইভেনিয়েন্ট (), বা টোলওয়ারআইওয়্যারিয়েন্ট () ব্যবহার করার দরকার নেই এবং এই 4 টি কার্যক্রমে বিভিন্ন পারফরম্যান্সের মানদণ্ড রয়েছে। এটি সম্পর্কে মাইক্রোসফ্ট কর্মক্ষমতা নিয়ম দেখুন। (আবেদনের কর্মক্ষমতা)

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

3- দেখে মনে হচ্ছে ORM সমাধানগুলির সাথে সমস্যা আছে যেমন এনকেবার্নেট যখন পিকে / এফকে হয় না তখন। (বিকাশকারী পারফরম্যান্স)

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