একাধিক ক্যোয়ারী বনাম জয়েন্টগুলি জিজ্ঞাসা করুন


180

যোগদানের প্রশ্নগুলি কি বেশ কয়েকটি প্রশ্নের তুলনায় দ্রুত? (আপনি আপনার মূল ক্যোয়ারীটি চালান, এবং তারপরে আপনি আপনার মূল ক্যোয়ারী থেকে প্রাপ্ত ফলাফলের উপর ভিত্তি করে আরও অনেকগুলি SELECTs চালান)

আমি জিজ্ঞাসা করছি কারণ তাদের সাথে যোগ দেওয়ার ফলে আমার অ্যাপ্লিকেশনটির নকশা অনেক জটিল হবে

এগুলি যদি দ্রুত হয় তবে কেউ কতটা দ্বারা মোটামুটি অনুমান করতে পারেন? যদি এটি 1.5x হয় তবে আমি যত্নশীল না, তবে এটি যদি 10x হয় তবে আমি অনুমান করি।


আমি ধরে নিচ্ছি তারা আরও দ্রুত হবে। আমি জানি যে 10 টি আলাদা আলাদা ইনসার্ট ক্যোয়ারী তুলনায় একটি ইনসার্ট খুব দ্রুত much
অ্যালেক্স

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

উত্তর:


82

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


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

4
আমি মনে করি এটি আপনার "দ্রুত" সংজ্ঞাটির উপর নির্ভর করে ... উদাহরণস্বরূপ, 3 পিকে অভ্যন্তরীণ সংযোগগুলি নেটওয়ার্কের ওভারহেডের কারণে 4 রাউন্ড-ট্রিপগুলির চেয়ে দ্রুত ঘুরে দাঁড়াতে পারে এবং কারণ আপনার পরে প্রতিটি ক্যোয়ারী থামিয়ে প্রস্তুত এবং প্রেরণ করতে হবে need পূর্ববর্তী কোয়েরি সম্পূর্ণ হয়। আপনি যদি লোডের নিচে কোনও সার্ভারকে বেনমার্ক করতে থাকেন তবে বেশিরভাগ ক্ষেত্রে, পি কে অনুসন্ধানে বনাম বেশি সিপিইউ সময় লাগবে এবং প্রায়শই আরও বেশি নেটওয়ার্কের ওভারহেডের কারণও হয়।
mindplay.dk

97

অভ্যন্তরীণ যোগদানের জন্য, একটি একক ক্যোয়ারী অর্থবোধ করে, যেহেতু আপনি কেবল সারি সারি মিলিয়ে পান get বাম যোগদানের জন্য, একাধিক ক্যোয়ারী অনেক ভাল ... নীচের মানদণ্ডটি আমি দেখেছি:

  1. 5 যোগদান করে একক ক্যোয়ারী

    ক্যোয়ারী: 8.074508 সেকেন্ড

    ফলাফলের আকার: 2268000

  2. এক সারিতে 5 টি প্রশ্ন

    সম্মিলিত ক্যোয়ারির সময়: 0.00262 সেকেন্ড

    ফলাফলের আকার: 165 (6 + 50 + 7 + 12 + 90)

নোট করুন যে আমরা উভয় ক্ষেত্রে একই ফলাফল পেয়েছি (6 x 50 x 7 x 12 x 90 = 2268000)

বাম যোগ দেয় রিন্ডানড ডেটার সাথে তাত্পর্যপূর্ণ আরও মেমরি ব্যবহার করে।

আপনি কেবল দুটি টেবিলের সংযুক্তি করলে মেমরির সীমাটি ততটা খারাপ নাও হতে পারে, তবে সাধারণত তিন বা আরও বেশি হয় এবং এটি বিভিন্ন প্রশ্নের পক্ষে মূল্যবান হয়ে ওঠে।

পার্শ্ব নোট হিসাবে, আমার মাইএসকিউএল সার্ভারটি আমার অ্যাপ্লিকেশন সার্ভারের ঠিক পাশেই রয়েছে ... সুতরাং সংযোগের সময় নগণ্য। যদি আপনার সংযোগের সময়টি সেকেন্ডে হয়, তবে সম্ভবত কোনও সুবিধা রয়েছে

অকপট


31
যদি আমরা বিরক্তিকর সামান্য সত্যটি টস করে দেখি যে তাদের ডান মনের কেউ 5 টি টেবিলের মধ্যে ক্রস করে না (তবে বেশিরভাগ ক্ষেত্রে এটি কেবল বুদ্ধিমান হয় না ), আপনার "বেঞ্চমার্ক" এর কিছুটা যোগ্যতা থাকতে পারে । তবে বাম বা অভ্যন্তরীণ সংযুক্তিগুলি আদর্শ হয়, সাধারণত কী দ্বারা (খুব দ্রুত পুনরুদ্ধার করা) এবং ডেটারের নকলটি সাধারণত এটির থেকে অনেক কম হয় you're
সিএইচও

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

5
@ নাথানএডামস: বাম এবং অভ্যন্তরীণ যোগদানগুলি মোটেই খারাপ নয়। (আসলে, আপনি যদি এখানে এবং সেখানে সারণীতে যোগদান না করে থাকেন তবে আপনি এসকিউএল ভুল করছেন)) আমি যা বলছিলাম তা ক্রস যোগ দেয় , যা প্রায় সবসময়ই দুটি টেবিলের মধ্যেও অনাকাঙ্ক্ষিত থাকে 5 এবং যাকে বলে উপরোক্ত উল্লিখিত অন্যথায়-সম্পূর্ণ-বোগাস "2268000" পাওয়ার একমাত্র উপায় সম্পর্কে সন্ধান করুন।
সিএওও

2
ফলাফল দেখুন, যদিও। "ফলাফলের আকার: 2268000" বনাম "ফলাফলের আকার: 165"। আমি মনে করি আপনার যোগদানের সাথে সংযুক্তি হ'ল কারণ আপনার রেকর্ডগুলির একে অপরের সাথে একের সাথে একাধিক সম্পর্ক রয়েছে, অন্যদিকে যদি তাদের একের সাথে সম্পর্ক থাকে তবে জিন একেবারে দ্রুততর হয় এবং এর অবশ্যই কোনও ফল হয় না would আকারের চেয়ে বড় নির্বাচন করুন।
হোল্ডঅফহাঙ্গার

3
@ কে হাও স্পষ্টতই আপনার প্রথম মন্তব্যের সময় আপনি ম্যাজেন্টোর সাথে দেখা করেন নি
ভিটোরিওডেফ

26

এই প্রশ্নটি পুরানো, তবে কিছু মানদণ্ড অনুপস্থিত। আমি এর 2 প্রতিযোগীর বিরুদ্ধে জয়েনকে বেঞ্চমার্ক করেছি:

  • এন + 1 ক্যোয়ারী
  • ২ টি ক্যোয়ারী, দ্বিতীয়টি একটি WHERE IN(...)বা সমতুল্য ব্যবহার করে

ফলাফলের স্পষ্ট: মাইএসকিউএল উপর, JOINহয় অনেক দ্রুত। এন +1 ক্যোরিয়াস একটি অ্যাপ্লিকেশনটির কার্যকারিতা হ্রাস করতে পারে:

বনাম যেখানে যেখানে বনাম এন + 1 এ যোগদান করুন

এটি হ'ল যদি না আপনি প্রচুর রেকর্ড নির্বাচন করেন যা খুব অল্প সংখ্যক স্বতন্ত্র, বিদেশী রেকর্ডকে নির্দেশ করে। চরম মামলার একটি মানদণ্ড এখানে:

জয় বনাম এন + 1 - একই বিদেশী রেকর্ডের দিকে নির্দেশ করে সমস্ত রেকর্ড

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

ছাড়াইয়া লত্তয়া:

  • * টু ওয়ান সম্পর্কের জন্য, সর্বদা ব্যবহার করুন JOIN
  • *-থেকে-বহু সম্পর্কের জন্য, দ্বিতীয় কোয়েরিটি দ্রুত হতে পারে

আরও তথ্যের জন্য মিডিয়াম আমার নিবন্ধ দেখুন ।


22

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

আমি বুঝতে পারি যে জিজ্ঞাসার এক উপায়ে যদি 0.02 সেকেন্ড বলে এবং অন্যটি 20 সেকেন্ড সময় নেয়, তবে এটি একটি বিরাট পার্থক্য। তবে যদি জিজ্ঞাসার এক উপায়ের জন্য 0.0000000002 সেকেন্ড সময় লাগে এবং অন্যটি 0.0000002 সেকেন্ড নেয়? উভয় ক্ষেত্রেই এক উপায় একটি খুব বড় 1000 গুণ অন্যটি তুলনায় দ্রুততর, কিন্তু এটা হয় সত্যিই এখনও দ্বিতীয় ক্ষেত্রে "খুব বড়"?

নীচের লাইনটি আমি ব্যক্তিগতভাবে এটি দেখতে পাচ্ছি: এটি যদি ভাল সম্পাদন করে তবে সহজ সমাধানের দিকে যান।


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

@ দেদেওয়াদ জ্ঞান অর্জন করে। এটি সব আপনার শেষের দিকে নির্ভর করে।
ভ্যালেন্টিন ফ্ল্যাচসেল

4
হাহ হ্যাঁ ... কারণ গুগলে 1 ন্যানোসেকেন্ড হারিয়ে যাওয়া আক্ষরিক অর্থেই 10 বিলিয়ন ট্রিলিয়ন ডলারের মতো সমান ... তবে এটি কেবল একটি গুজব।
দুদেওয়াদ

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

15

50,000 সারি সারণী থেকে একটি সারি নির্বাচন করে এবং 100,000 সারি সারণী থেকে একটি সারি সহ যোগদান করে একটি দ্রুত পরীক্ষা করেছে। মূলত:

$id = mt_rand(1, 50000);
$row = $db->fetchOne("SELECT * FROM table1 WHERE id = " . $id);
$row = $db->fetchOne("SELECT * FROM table2 WHERE other_id = " . $row['other_id']);

বনাম

$id = mt_rand(1, 50000);
$db->fetchOne("SELECT table1.*, table2.*
    FROM table1
    LEFT JOIN table1.other_id = table2.other_id
    WHERE table1.id = " . $id);

দুটি নির্বাচন পদ্ধতিটি 50,000 পাঠের জন্য 3.7 সেকেন্ড সময় নিয়েছে এবং আমার বাড়িতে থাকা ধীর গতির কম্পিউটারে জোইন ২.০ সেকেন্ড সময় নিয়েছে। অন্তর্ভুক্ত যোগদান করুন এবং বাম জোনে কোনও পার্থক্য হয়নি। একাধিক সারি আনার (উদাহরণস্বরূপ, INT ব্যবহার করে) অনুরূপ ফলাফল পেয়েছে।


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

কলামগুলি আইডি এবং অন্যান্য_আইডি সূচকযুক্ত?
আরিশ রমেশ

11

আসল প্রশ্ন হ'ল: এই রেকর্ডগুলির কি এক-একের সম্পর্ক বা এক-একের মধ্যে অনেকগুলি সম্পর্ক রয়েছে ?

টিএলডিআর উত্তর:

যদি ওয়ান-টু ওয়ান হয় তবে একটি JOINবিবৃতি ব্যবহার করুন ।

যদি এক থেকে অনেকগুলি SELECTহয় তবে সার্ভার-সাইড কোড অপটিমাইজেশন সহ একটি (বা অনেক) বিবৃতি ব্যবহার করুন।

অপ্টিমাইজেশনের জন্য কেন এবং কীভাবে নির্বাচন করুন

SELECTএক-একাধিক সম্পর্কের উপর ভিত্তি করে রেকর্ডের বৃহত গ্রুপে 'ইনগ (একত্রিত হওয়ার পরিবর্তে একাধিক প্রশ্নের সাথে) যুক্ত হয়ে একটি অনুকূল দক্ষতা তৈরি করে, কারণ JOIN' আইং-এর ক্ষতিকারক মেমরি ফাঁসের সমস্যা রয়েছে। সমস্ত ডেটা গ্র্যাব করুন, তারপরে সাজানোর জন্য একটি সার্ভার-সাইড স্ক্রিপ্টিং ভাষা ব্যবহার করুন:

SELECT * FROM Address WHERE Personid IN(1,2,3);

ফলাফল:

Address.id : 1            // First person and their address
Address.Personid : 1
Address.City : "Boston"

Address.id : 2            // First person's second address
Address.Personid : 1
Address.City : "New York"

Address.id : 3            // Second person's address
Address.Personid : 2
Address.City : "Barcelona"

এখানে, আমি একটি নির্বাচনী বিবৃতিতে সমস্ত রেকর্ড পাচ্ছি। এটি এর চেয়ে ভাল JOIN, যা এই রেকর্ডগুলির একটি ছোট গ্রুপ পাবে, একসময় একসময় অন্য কোয়েরির উপ-উপাদান হিসাবে। তারপরে আমি এটিকে সার্ভার-সাইড কোড দিয়ে পার্স করব যা দেখে মনে হচ্ছে ...

<?php
    foreach($addresses as $address) {
         $persons[$address['Personid']]->Address[] = $address;
    }
?>

যখন অপ্টিমাইজেশনের জন্য যোগদান না করা

JOIN'একক রেকর্ডের সাথে এক-একের সম্পর্কের ভিত্তিতে রেকর্ডের একটি বৃহত গ্রুপকে যুক্ত করা SELECTএকের পর এক বিবৃতিগুলির তুলনায় সর্বোত্তম দক্ষতা অর্জন করে , যা কেবল পরবর্তী রেকর্ডের ধরণটি পায় get

কিন্তু JOINঅদক্ষ হলে একের সাথে অধিকের সম্পর্ক সঙ্গে রেকর্ড পেয়ে যায়।

উদাহরণ: ডাটাবেস ব্লগগুলিতে 3 টি টেবিলের আগ্রহ, ব্লগপোস্ট, ট্যাগ এবং মন্তব্য রয়েছে।

SELECT * from BlogPost
LEFT JOIN Tag ON Tag.BlogPostid = BlogPost.id
LEFT JOIN Comment ON Comment.BlogPostid = BlogPost.id;

যদি 1 টি ব্লগপোস্ট, 2 ট্যাগ এবং 2 টি মন্তব্য থাকে তবে আপনি ফলাফল পাবেন:

Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag2, comment1,
Row4: tag2, comment2,

প্রতিটি রেকর্ডটি কীভাবে সদৃশ হয় তা লক্ষ্য করুন। ঠিক আছে, সুতরাং, 2 মন্তব্য এবং 2 ট্যাগ 4 সারি। যদি আমাদের 4 টি মন্তব্য এবং 4 টি ট্যাগ থাকে? আপনি 8 টি সারি পান না - আপনি 16 টি সারি পান:

Row1: tag1, comment1,
Row2: tag1, comment2,
Row3: tag1, comment3,
Row4: tag1, comment4,
Row5: tag2, comment1,
Row6: tag2, comment2,
Row7: tag2, comment3,
Row8: tag2, comment4,
Row9: tag3, comment1,
Row10: tag3, comment2,
Row11: tag3, comment3,
Row12: tag3, comment4,
Row13: tag4, comment1,
Row14: tag4, comment2,
Row15: tag4, comment3,
Row16: tag4, comment4,

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

এই সদৃশগুলি আপনার জন্য কী ব্যয় করে? মেমরি (এসকিউএল সার্ভারে এবং কোডটি যা নকলগুলি সরিয়ে দেওয়ার চেষ্টা করে) এবং নেটওয়ার্কিং সংস্থানসমূহ (এসকিউএল সার্ভার এবং আপনার কোড সার্ভারের মধ্যে)।

সূত্র: https://dev.mysql.com/doc/refman/8.0/en/nested-join-optimization.html ; https://dev.mysql.com/doc/workbench/en/wb-relationship-tools.html


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

@ সিএইচও: আপনার মন্তব্যের জন্য ধন্যবাদ। উপরের আমার উত্তরটি মাইএসকিউএল ডকুমেন্টেশনের সংক্ষিপ্তসারটি এখানে পাওয়া গেছে: dev.mysql.com/doc/workbench/en/wb-referenceship-tools.html
হোল্ডঅফহঙ্গার

এটি মাইএসকিউএল ডকুমেন্টেশন নয়। এটি মাইএসকিউএল ডাটাবেসগুলির সাথে কাজ করার জন্য একটি নির্দিষ্ট জিইউআই সরঞ্জামটির জন্য ডকুমেন্টেশন। এবং কবে যোগদানের উপযুক্ত হয় (বা না হয়) সে সম্পর্কে কোনও নির্দেশিকা দেয় না।
সিএওও

@ সিএইচও: দুঃখিত, আমি মাইএসকিউএল ওয়ার্কব্যাঞ্চ (টিএম) এর জন্য মাইএসকিউএল (আর) ডকুমেন্টেশনটি চেয়েছি, মাইএসকিউএল সার্ভার (টিএম) নয়।
হোল্ডঅফহাঙ্গার

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

8

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

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


7

ডেভেলপার জটিলতার তুলনায় ডাটাবেসের জটিলতার উপর নির্ভর করে অনেকগুলি সেল কল করা সহজ হতে পারে।

JOIN এবং একাধিক নির্বাচন উভয়ের বিরুদ্ধে কিছু ডাটাবেস পরিসংখ্যান চালানোর চেষ্টা করুন। আপনার পরিবেশে JOIN নির্বাচন / নির্বাচনের চেয়ে ধীর / গতিতে দেখুন।

তারপরে আবার যদি জোয়িনে পরিবর্তন করা মানে কোনও অতিরিক্ত দিন / সপ্তাহ / মাস দেব কাজের মাস হয়ে থাকে তবে আমি একাধিক SELECTs দিয়ে আটকে থাকি

চিয়ার্স,

BLT


5

আমার অভিজ্ঞতার মধ্যে আমি খুঁজে পেয়েছি যে বেশ কয়েকটি ক্যোয়ারী চালানো সাধারণত দ্রুত হয়, বিশেষত যখন বড় ডেটা সেটগুলি পুনরুদ্ধার করে।

যখন অন্য অ্যাপ্লিকেশন, যেমন পিএইচপি থেকে ডেটাবেস সাথে ইন্টারঅ্যাক্ট করা হয় তখন সার্ভারে একাধিকবার ট্রিপ করার যুক্তি রয়েছে।

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

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

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


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

4

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

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

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

+------------+     +---------+     +---------+
|  comment   |     |   post  |     |  tag    |
|------------|*   1|---------|1   *|---------|
| post_id    |-----| post_id |-----| post_id |
| comment_id |     | ...     |     | tag_id  |
| user_id    |     |         |     | ...     |
| ...        |     |         |     | ...     |
+------------+     +---------+     +---------+

এই ক্ষেত্রে, এটি কমপক্ষে দুটি পৃথক প্রশ্ন হওয়া উচিত দ্ব্যর্থহীনভাবে ভাল। আপনি যদি ট্যাগ এবং মন্তব্যে যোগদানের চেষ্টা করেন, কারণ দুজনের মধ্যে সরাসরি সম্পর্ক নেই, আপনি ট্যাগ এবং মন্তব্যের প্রতিটি সম্ভাব্য সংমিশ্রণটি শেষ করেন। many * many == manymany। এগুলি ছাড়াও, যেহেতু পোস্ট এবং ট্যাগগুলি সম্পর্কিত নয়, আপনি এই দুটি প্রশ্নের সমান্তরালভাবে করতে পারেন, সম্ভাব্য লাভের দিকে পরিচালিত করে।

আসুন তবে আলাদা পরিস্থিতি বিবেচনা করুন: আপনি কোনও পোস্টের সাথে মন্তব্যগুলি এবং মন্তব্যকারীদের যোগাযোগের তথ্য সংযুক্ত করতে চান।

 +----------+     +------------+     +---------+
 |   user   |     |  comment   |     |   post  |
 |----------|1   *|------------|*   1|---------|
 | user_id  |-----| post_id    |-----| post_id |
 | username |     | user_id    |     | ...     |
 | ...      |     | ...        |     +---------+
 +----------+     +------------+

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


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

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

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

3

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


2

এখানে 100 টি দরকারী প্রশ্নের সাথে একটি লিঙ্ক রয়েছে, এগুলি ওরাকল ডাটাবেসে পরীক্ষিত হয় তবে মনে রাখবেন এসকিউএল একটি মান, যা ওরাকল, এমএস এসকিউএল সার্ভার, মাইএসকিউএল এবং অন্যান্য ডাটাবেসের মধ্যে পৃথক, এসকিউএল উপভাষা:

http://javaforlearn.com/100-sql-queries-learn/


1

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

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

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


0

হ্যাঁ, JOINS ব্যবহার করে একটি ক্যোয়ারী আরও দ্রুত হবে। যদিও আপনি যে সারণীগুলির সন্ধান করছেন সেগুলির সম্পর্কগুলি, আপনার ডেটাসেটের আকার বা প্রাথমিক কীগুলি যেখানে রয়েছে তা না জেনে কতটা দ্রুত বলা যায় প্রায় অসম্ভব।

উভয় পরিস্থিতি কেন পরীক্ষা করে দেখা হচ্ছে না, তবে আপনি নিশ্চিতভাবে জানতে পারবেন ...

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