মাইএসকিউএল: বাম বাহ্যিক জোড় এবং অভ্যন্তরীণ যোগদানের মধ্যে কোনটি যুক্ত ভাল


11

যদি সবার সাথে একই ফলাফল প্রদান করা হয় তবে কোন যোগদানটি আরও ভাল পরিবেশিত হয়? উদাহরণস্বরূপ, আমার কাছে দুটি টেবিল রয়েছে employees(emp_id,name, address, designation, age, sex)এবং work_log(emp_id,date,hours_wored)। উভয় নির্দিষ্ট ফলাফল পেতে inner joinএবং left joinএকই ফলাফল দেয়। তবে, আমার এখনও কিছু সন্দেহ রয়েছে যা কেবলমাত্র এই প্রশ্নের মধ্যে সীমাবদ্ধ নয়।

  • কোন যোগদানের আরও কার্যকর যা একই ফলাফল মানের ক্ষেত্রে পছন্দ করা উচিত?
  • যোগদানের আবেদন করার সময় অন্যান্য বিষয়গুলি কী বিবেচনা করা উচিত?
  • অভ্যন্তরীণ যোগদান এবং ক্রস জয়েনের মধ্যে কোনও সম্পর্ক আছে?

উত্তর:


15

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

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

JOIN প্রকারের ভিজ্যুয়াল ব্যাখ্যা

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

সংক্ষেপে, LEFT JOINআপনি সত্যি বলতে চাইলে ব্যবহার করবেন না INNER JOIN

মাইএসকিউএল সালে CROSS JOIN, INNER JOINএবং JOINএকই। মানক এবং শব্দার্থিক ভাবে একটি CROSS JOINএকটি হল INNER JOINএকটি ছাড়া ONদফা, তাই আপনি সারণির মধ্যে সারি প্রতিটি সমন্বয় পেতে।

আপনার কাছে উইকিপিডিয়ায় সমস্ত ধরণের সংযোজনীয় উদাহরণ রয়েছে । অনুশীলনে, মাইএসকিউএলে, আমরা কেবল লেখার ঝোঁক রাখি JOINএবং LEFT JOIN


1
GR8 ব্যাখ্যা @ জাইনাস। এটি ভাগ্যবান যে আমি আমার প্রশ্নের উত্তর পেয়েছি কেবল এটি আপনার কাছ থেকে।
ursiteion

1 প্রাসঙ্গিক গ্রাফিক 1000 শব্দের চেয়ে ভাল। তুমি কি এট তৈরি করেছ?
Fr0zenFyr

না, আমি তা করি নি, কোডিপ্রজেক্ট / আর্টিকেলস / 30৩০৫২/২ চিত্রটির নীচে রয়েছে - যদিও যোগদানের প্রতিনিধিত্ব করতে ভেন ডায়াগ্রাম ব্যবহার করা তার বীজগণিত আনুষ্ঠানিকতার মতোই পুরানো: en.wikedia.org/wiki/Relational_algebra
jynus

আমি মন্তব্যের একটি সেট শুরু করেছিলাম তখন বুঝতে পারলাম এটি সমস্ত ফোটে - এটি আপনার প্রশ্নের উপর নির্ভর করে। আমার কাছ থেকে +1!
ইহানেই


0

যদি সকলে একই ফলাফল প্রদান করে তবে কোন যোগদানটি আরও ভালভাবে সম্পাদন করছে?

আমি পূর্ববর্তী উত্তরের সংযোজন করেছি, আমি যা জানি তার জন্য মাইএসকিউএল একইরকম পারফরম্যান্স পাওয়ার জন্য অনুকূলিত।

ভাল সূচক সহ, উদাহরণস্বরূপ, JOINবনাম LEFT JOIN+ WHEREফিল্টার করার জন্য ক্লজ, একই জিনিস হবে। অপ্টিমাইজেশান বনাম হিউম্যান রিডিং অনেকগুলি যোগদানের সাথে বৃহত প্রশ্নগুলিতে বোঝা যায়।

ভাল সূচক এবং ক্যাশে ব্যবহার করা আরও গুরুত্বপূর্ণ।

আপনি এখানে অপ্টিমাইজেশন প্রক্রিয়াটির একটি ভাল ব্যাখ্যা পড়তে পারেন:

ক্যোয়ারী অপটিমাইজেশন প্রক্রিয়া : একটি কোয়েরি প্রায়শই বিভিন্নভাবে কার্যকর করা যায় এবং একই ফলাফল তৈরি করতে পারে। অপ্টিমাইজারের কাজটি সেরা বিকল্পটি খুঁজে পাওয়া find


0

এটি আমার জন্য একই নয়, মাইএসকিএল 5.7 8 ভিসিপিইউ, 52 জিবি র‌্যাম

নিম্নলিখিত ক্যোয়ারীতে ~ 30 সেকেন্ড সময় লাগে কেন তা নিশ্চিত নয়

লেনদেন সারণীতে 24,257,151 টি রেকর্ড রয়েছে

ক্রিয়াকলাপ সারণীতে 18,603,665 টি রেকর্ড রয়েছে

ক্রয়ের টেবিলটিতে 13,911,705 রেকর্ড রয়েছে

সমস্ত প্রয়োজনীয় সূচি স্থানে রয়েছে

SELECT
    `trx`.`transaction_pk`,
    `trx`.`created`,
    `trx`.`updated`,
    `p`.`amount`,
    `trxst`.`name`,
    COALESCE ( a.units, 0 ) AS units
FROM
    `transaction` AS `trx`
    INNER JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`
    left JOIN `activity` AS `a` ON `a`.`transaction_fk` = `trx`.`transaction_pk`
    LEFT JOIN `purchases` AS `p` ON `p`.`transaction_fk` = `trx`.`transaction_pk` 
WHERE
    `trx`.`entity_fk` IN ( 1234) 
    AND `trx`.`transaction_sub_type_fk` IN (
    2, 4, 5, 15, 16, 33, 37, 38, 85, 86, 87, 88, 102, 103 
    ) 
ORDER BY
    `trx`.`transaction_pk` DESC LIMIT 100 OFFSET 0;

নিম্নলিখিত লাইনটি প্রতিস্থাপনের পরে:

INNER JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`

বাম যোগদানের সাথে

LEFT JOIN `transaction_sub_type` AS `trxst` ON  `trx`.`transaction_sub_type_fk`= `trxst`.`transaction_sub_type_pk`

একই ক্যোয়ারিতে ~ 0.046 নেওয়া হয়

এর আগে ব্যাখ্যা করুন:

1   SIMPLE  trxst       ALL PRIMARY             101 37.62   Using where; Using temporary; Using filesort
1   SIMPLE  trx     ref transaction_sub_type_fk,entity_fk   transaction_sub_type_fk 4   trxst.transaction_sub_type_pk   2548    0.36    Using where
1   SIMPLE  a       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
1   SIMPLE  p       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 

এর পরে ব্যাখ্যা করুন:

1   SIMPLE  trx     ref transaction_sub_type_fk,entity_fk   entity_fk   4   const   81474   83.65   Using where
1   SIMPLE  trxst       eq_ref  PRIMARY PRIMARY 4   trx.transaction_sub_type_fk 1   100 
1   SIMPLE  a       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
1   SIMPLE  p       ref transaction_fk  transaction_fk  4   trx.transaction_pk  1   100 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.