পারফরম্যান্সে মাইএসকিউএল বা বনাম


180

আমি ভাবছি যে নিম্নলিখিতগুলির মধ্যে পারফরম্যান্সের ক্ষেত্রে কোনও পার্থক্য আছে কিনা

SELECT ... FROM ... WHERE someFIELD IN(1,2,3,4)

SELECT ... FROM ... WHERE someFIELD between  0 AND 5

SELECT ... FROM ... WHERE someFIELD = 1 OR someFIELD = 2 OR someFIELD = 3 ... 

অথবা মাইএসকিউএল এসকিউএলকে একইভাবে সংহতকারীরা কোডটি অনুকূলিত করবে?

সম্পাদনা: মন্তব্যগুলিতে বর্ণিত কারণে AND'এর থেকে OR' পরিবর্তন করা হয়েছে।


আমি এই জিনিসটি নিয়েও গবেষণা করছি, তবে কিছু বক্তব্যের বিরোধিতা করে যে IN OR s I could say that it can also be converted to UNIONএর সারিতে রূপান্তরিত হবে যা কোয়েরিটি অনুকূলিত করার জন্য OR`s প্রতিস্থাপনের জন্য পুনঃসংশ্লিষ্ট।
জোনিস গ্রুজিস

উত্তর:


249

আমার এটি নিশ্চিতভাবে জানা দরকার ছিল, তাই আমি উভয় পদ্ধতির বেঞ্চমার্ক করেছি। আমি দৃ INis়ভাবে ব্যবহারের চেয়ে অনেক দ্রুত হতে পেরেছি OR

যারা তাদের "মতামত" দেয় তাদের বিশ্বাস করবেন না, বিজ্ঞান সমস্ত পরীক্ষা এবং প্রমাণ সম্পর্কে।

সমমানের অনুসন্ধানগুলির জন্য আমি 1000x এর একটি লুপ চালিয়েছি (ধারাবাহিকতার জন্য, আমি ব্যবহার করেছি sql_no_cache):

IN: 2.34969592094 এস

OR: 5.83781504631 এস

আপডেট:
(মূল পরীক্ষার জন্য উত্স কোডটি আমার কাছে নেই, যেমন এটি was বছর আগে ছিল, যদিও এটি এই পরীক্ষার মতো একই পরিসরে ফলাফল দেয়)

এটি পরীক্ষা করার জন্য কিছু নমুনা কোডের জন্য অনুরোধ, এখানে সম্ভাব্যতম সহজ ব্যবহারের কেস। সিনট্যাক্স সরলতার জন্য বুদ্ধিমান ব্যবহার করে, কাঁচা এসকিউএল সমতুল্য একই কার্যকর করে।

$t = microtime(true); 
for($i=0; $i<10000; $i++):
$q = DB::table('users')->where('id',1)
    ->orWhere('id',2)
    ->orWhere('id',3)
    ->orWhere('id',4)
    ->orWhere('id',5)
    ->orWhere('id',6)
    ->orWhere('id',7)
    ->orWhere('id',8)
    ->orWhere('id',9)
    ->orWhere('id',10)
    ->orWhere('id',11)
    ->orWhere('id',12)
    ->orWhere('id',13)
    ->orWhere('id',14)
    ->orWhere('id',15)
    ->orWhere('id',16)
    ->orWhere('id',17)
    ->orWhere('id',18)
    ->orWhere('id',19)
    ->orWhere('id',20)->get();
endfor;
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080514.3635
1482080517.3713
3.0078368186951

$t = microtime(true); 
for($i=0; $i<10000; $i++): 
$q = DB::table('users')->whereIn('id',[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])->get(); 
endfor; 
$t2 = microtime(true); 
echo $t."\n".$t2."\n".($t2-$t)."\n";

1482080534.0185
1482080536.178
2.1595389842987


21
এই পরীক্ষাগুলিতে কোন সূচকগুলি ব্যবহৃত হয়েছিল?
উদ্বিগ্ন

5
আমিও প্রশ্নের নিখুঁত এবং জানতে পারলেন যে ছিল INবিবৃতি সম্পর্কে 30% একটি তুলনায় দ্রুততর ছিল OR
টিমো 1002

12
Do not believe people who give their "opinion"আপনি 100% ঠিক আছেন, স্ট্যাক ওভারফ্লো দুর্ভাগ্যক্রমে সেগুলি পূর্ণ
15'15 এ এলিপল্টোরাক

7
পারফরম্যান্সের কারণ (মারিয়াডিবি (একটি মাইএসকিউএল নতুন ফ্রি ব্রাঞ্চ) ডক্সের উদ্ধৃতি): => যদি আপনার কলামটি পূর্ণসংখ্যার হয় তবে খুব পূর্ণসংখ্যারও পাশ করুন ...Returns 1 if expr is equal to any of the values in the IN list, else returns 0. If all values are constants, they are evaluated according to the type of expr and sorted. The search for the item then is done using a binary search. This means IN is very quick if the IN value list consists entirely of constants . Otherwise, type conversion takes place according to the rules described at Type Conversion, but applied to all the arguments.IN
jave.web

10
' যারা "তাদের মতামত দেয়" তাদের বিশ্বাস করবেন না : এই চিত্রগুলি প্রাপ্ত করার জন্য ব্যবহৃত স্ক্রিপ্ট, টেবিল এবং সূচিপত্রগুলি বাদ দিয়ে পারফরম্যান্সের পরিসংখ্যান সরবরাহ করা যাচাই করা যায় না। এই হিসাবে, পরিসংখ্যান একটি "মতামত" হিসাবে ভাল।
বিভ্রান্ত

67

আমি ভবিষ্যতের গুগলারের জন্যও একটি পরীক্ষা করেছি। ফিরে আসা ফলাফলের মোট সংখ্যা 10000 এর মধ্যে 7264

SELECT * FROM item WHERE id = 1 OR id = 2 ... id = 10000

এই প্রশ্নের 0.1239সেকেন্ড সময় নিয়েছে

SELECT * FROM item WHERE id IN (1,2,3,...10000)

এই প্রশ্নের 0.0433সেকেন্ড সময় নিয়েছে

IN তুলনায় 3 গুণ দ্রুত OR


15
মাইএসকিউএল ইঞ্জিনটি কী ছিল এবং আপনি দুটি প্রশ্নের মধ্যে মাইএসকিউএল বাফার এবং ওএস ফাইল ক্যাশে সাফ করেছেন?
dabest1

2
আপনার পরীক্ষাটি একটি সংকীর্ণ ব্যবহারের ক্ষেত্রে। ক্যোয়ারীটি 72২% ডেটা ফেরত দেয় এবং সূচকগুলি থেকে উপকার পাওয়ার সম্ভাবনা কম।
বিভ্রান্ত

আমি বাজি ধরেছিলাম যে বেশিরভাগ সময় ক্যোরিটি ব্যয় করা, এটি বিশদকরণ, এবং ক্যোয়ারি এটির পরিকল্পনা করে। এটি অবশ্যই একটি বিবেচ্য বিষয়: যদি আপনি 10 কে বা বিবৃতি পেতে চলেছেন তবে আপনার কাছে প্রচুর নিরঙ্কুশ পাঠ্য রয়েছে যা কেবল এটির সাথে প্রকাশ করছে OR: সর্বাধিক কমপ্যাক্ট এক্সপ্রেশনটি ব্যবহার করা ভাল।
বিশপ

17

গৃহীত উত্তরটি কারণ ব্যাখ্যা করে না।

নীচে হাই পারফরম্যান্স মাইএসকিউএল, তৃতীয় সংস্করণ থেকে উদ্ধৃত হয়েছে।

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


নির্দিষ্ট ডাটাবেস কারণে কল্পনাপ্রসূত রেফারেন্স। নিস!
জোশুয়া পিন্টার

নিখুঁত এবং বিন্দুতে
gaurav9620

16

আমি মনে করি যে বিটউইইএন দ্রুততর হবে কারণ এটি রূপান্তরিত হওয়া উচিত:

Field >= 0 AND Field <= 5

এটি আমার বোধগম্য যে কোনও আইএন যেভাবেই বা বিবৃতিতে ঘটতে পারে a IN এর মান হ'ল ব্যবহারের সহজলভ্যতা। (প্রতিটি কলামের নাম একাধিকবার টাইপ করা এবং বিদ্যমান যুক্তির সাথে ব্যবহার করা আরও সহজ করে দেয় - আপনার ওআর / অথবা এর নজির সম্পর্কে চিন্তা করতে হবে না কারণ আইএন হ'ল একটি বক্তব্য OR তাদের শর্ত হিসাবে মূল্যায়ন করা হয়েছে তা নিশ্চিত করার জন্য আপনি তাদের প্রথম বন্ধনী দিয়ে ঘিরেছেন তা নিশ্চিত করার জন্য))

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


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

"এটি আমার বোঝা যাচ্ছে যে কোনওভাবেই কোনও আইএন গুচ্ছ ও স্টেটমেন্টগুলিতে রূপান্তরিত হবে" " কোথায় আপনি এই পড়া? আমি আশা করব যে এটি হ্যাশম্যাপে রাখার জন্য ও (1) লুকআপ করুন।
Ztyx

আইআর-এর রূপান্তরিত হচ্ছে এসকিউএল সার্ভার কীভাবে এটি পরিচালনা করে (বা কমপক্ষে এটি করেছিল - সম্ভবত এখন পরিবর্তিত হতে পারে, বছরের পর বছর এটি ব্যবহার করে নি)। আমি মাইএসকিউএল এটি করে এমন কোনও প্রমাণ খুঁজে পেতে অক্ষম হয়েছি।
রিচার্ডআটহোম

4
এই উত্তরটি সঠিক, এর মধ্যে "1 <= ফিল্ম_আইডি <= 5" তে রূপান্তরিত হয়েছে। অন্য দুটি সমাধান একক পরিসরের শর্তে ভাঁজ হয় না। আমার কাছে একটি ব্লগ পোস্ট রয়েছে যা এটি অপ্টিমাইজার ট্র্যাকটি ব্যবহার করে এটি এখানে দেখায়: tocker.ca/2015/05/25/…
মরগান টকার

13

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

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

আমি নিশ্চিত যে এর একটি সুনির্দিষ্ট উত্তর আছে তবে আমি এভাবে ব্যবহারিকভাবে বলতে চাইলে আমার প্রদত্ত প্রশ্নের উত্তরটি বের করব।

এটি কিছুটা সহায়ক হতে পারে: http://forge.mysql.com/wiki/Top10SQLPerformanceTips

শুভেচ্ছা,
ফ্রাঙ্ক


2
এটি নির্বাচিত উত্তর হওয়া উচিত।
জন z

3
লিঙ্কটি বাসি - আমার ধারণা এটি সমতুল্য হতে পারে? wikis.oracle.com / পৃষ্ঠাগুলি / পর্যালোচনা.অ্যাকশন?pageId=27263381 (ধন্যবাদ ওরাকল ;
পি

1
সমতুল্য পৃষ্ঠায়, এটি বলে: "ইনডেক্স ক্ষেত্রগুলিতে নির্বাচন করার সময় IN (...) ব্যবহার করা থেকে বিরত থাকুন, এটি নির্বাচন করুন অনুসন্ধানের কার্যকারিতাটি নষ্ট করবে" " - কোন ধারণা কেন?
jorisw

url এর মেয়াদ শেষ হয়ে গেছে
স্টিভ জিয়াং

7

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


4

যখন আপনি ভেবেছিলেন এটি নিরাপদ ...

আপনার মূল্য কি eq_range_index_dive_limit? বিশেষত, আপনার কি এই ধারাটিতে কম বা বেশি আইটেম রয়েছে IN?

এটিতে কোনও বেঞ্চমার্ক অন্তর্ভুক্ত থাকবে না তবে অভ্যন্তরীণ কাজগুলিকে কিছুটা পর্যবেক্ষণ করবে। কী চলছে তা দেখার জন্য একটি সরঞ্জাম ব্যবহার করুন - অপটিমাইজার ট্রেস।

ক্যোয়ারী: SELECT * FROM canada WHERE id ...

একটি সঙ্গে OR3 মূল্যবোধের , ট্রেস অংশ দেখে মনে হচ্ছে:

       "condition_processing": {
          "condition": "WHERE",
          "original_condition": "((`canada`.`id` = 296172) or (`canada`.`id` = 295093) or (`canada`.`id` = 293626))",
          "steps": [
            {
              "transformation": "equality_propagation",
              "resulting_condition": "(multiple equal(296172, `canada`.`id`) or multiple equal(295093, `canada`.`id`) or multiple equal(293626, `canada`.`id`))"
            },

...

              "analyzing_range_alternatives": {
                "range_scan_alternatives": [
                  {
                    "index": "id",
                    "ranges": [
                      "293626 <= id <= 293626",
                      "295093 <= id <= 295093",
                      "296172 <= id <= 296172"
                    ],
                    "index_dives_for_eq_ranges": true,
                    "chosen": true

...

        "refine_plan": [
          {
            "table": "`canada`",
            "pushed_index_condition": "((`canada`.`id` = 296172) or (`canada`.`id` = 295093) or (`canada`.`id` = 293626))",
            "table_condition_attached": null,
            "access_type": "range"
          }
        ]

আইসিপি কীভাবে দেওয়া হচ্ছে তা নোট করুন ORs। এটি বোঝায় যে ORরূপান্তরিত হয়নি IN, এবং ইনোডিবি আইসিপির =মাধ্যমে একগুচ্ছ পরীক্ষার কাজ করবে । (মাইআইএসএএম বিবেচনা করার মতো এটি আমি মনে করি না।)

(এটি পারকোনার 5.6.22-71.0-লগ; idএকটি গৌণ সূচক))

এখন কয়েকটি মান সহ IN () এর জন্য

eq_range_index_dive_limit= 10; 8 মান আছে।

        "condition_processing": {
          "condition": "WHERE",
          "original_condition": "(`canada`.`id` in (296172,295093,293626,295573,297148,296127,295588,295810))",
          "steps": [
            {
              "transformation": "equality_propagation",
              "resulting_condition": "(`canada`.`id` in (296172,295093,293626,295573,297148,296127,295588,295810))"
            },

...

              "analyzing_range_alternatives": {
                "range_scan_alternatives": [
                  {
                    "index": "id",
                    "ranges": [
                      "293626 <= id <= 293626",
                      "295093 <= id <= 295093",
                      "295573 <= id <= 295573",
                      "295588 <= id <= 295588",
                      "295810 <= id <= 295810",
                      "296127 <= id <= 296127",
                      "296172 <= id <= 296172",
                      "297148 <= id <= 297148"
                    ],
                    "index_dives_for_eq_ranges": true,
                    "chosen": true

...

        "refine_plan": [
          {
            "table": "`canada`",
            "pushed_index_condition": "(`canada`.`id` in (296172,295093,293626,295573,297148,296127,295588,295810))",
            "table_condition_attached": null,
            "access_type": "range"
          }
        ]

মনে রাখবেন যে এটি INরূপান্তরিত হয়েছে বলে মনে হচ্ছে না OR

একটি পার্শ্ব নোট: লক্ষ্য করুন যে ধ্রুবক মানগুলি বাছাই করা হয়েছিল । এটি দুটি উপায়ে উপকারী হতে পারে:

  • প্রায় কম লাফিয়ে, আরও ভাল মানের ক্যাশেিং, সমস্ত মান পেতে I / O কম থাকতে পারে।
  • যদি দুটি অনুরূপ ক্যোয়ারী পৃথক সংযোগ থেকে আসে এবং তারা লেনদেনে থাকে তবে ওভারল্যাপিং তালিকার কারণে অচলাবস্থার পরিবর্তে বিলম্ব হওয়ার আরও ভাল সম্ভাবনা রয়েছে।

অবশেষে, প্রচুর মান সহ IN ()

      {
        "condition_processing": {
          "condition": "WHERE",
          "original_condition": "(`canada`.`id` in (293831,292259,292881,293440,292558,295792,292293,292593,294337,295430,295034,297060,293811,295587,294651,295559,293213,295742,292605,296018,294529,296711,293919,294732,294689,295540,293000,296916,294433,297112,293815,292522,296816,293320,293232,295369,291894,293700,291839,293049,292738,294895,294473,294023,294173,293019,291976,294923,294797,296958,294075,293450,296952,297185,295351,295736,296312,294330,292717,294638,294713,297176,295896,295137,296573,292236,294966,296642,296073,295903,293057,294628,292639,293803,294470,295353,297196,291752,296118,296964,296185,295338,295956,296064,295039,297201,297136,295206,295986,292172,294803,294480,294706,296975,296604,294493,293181,292526,293354,292374,292344,293744,294165,295082,296203,291918,295211,294289,294877,293120,295387))",
          "steps": [
            {
              "transformation": "equality_propagation",
              "resulting_condition": "(`canada`.`id` in (293831,292259,292881,293440,292558,295792,292293,292593,294337,295430,295034,297060,293811,295587,294651,295559,293213,295742,292605,296018,294529,296711,293919,294732,294689,295540,293000,296916,294433,297112,293815,292522,296816,293320,293232,295369,291894,293700,291839,293049,292738,294895,294473,294023,294173,293019,291976,294923,294797,296958,294075,293450,296952,297185,295351,295736,296312,294330,292717,294638,294713,297176,295896,295137,296573,292236,294966,296642,296073,295903,293057,294628,292639,293803,294470,295353,297196,291752,296118,296964,296185,295338,295956,296064,295039,297201,297136,295206,295986,292172,294803,294480,294706,296975,296604,294493,293181,292526,293354,292374,292344,293744,294165,295082,296203,291918,295211,294289,294877,293120,295387))"
            },

...

              "analyzing_range_alternatives": {
                "range_scan_alternatives": [
                  {
                    "index": "id",
                    "ranges": [
                      "291752 <= id <= 291752",
                      "291839 <= id <= 291839",
                      ...
                      "297196 <= id <= 297196",
                      "297201 <= id <= 297201"
                    ],
                    "index_dives_for_eq_ranges": false,
                    "rows": 111,
                    "chosen": true

...

        "refine_plan": [
          {
            "table": "`canada`",
            "pushed_index_condition": "(`canada`.`id` in (293831,292259,292881,293440,292558,295792,292293,292593,294337,295430,295034,297060,293811,295587,294651,295559,293213,295742,292605,296018,294529,296711,293919,294732,294689,295540,293000,296916,294433,297112,293815,292522,296816,293320,293232,295369,291894,293700,291839,293049,292738,294895,294473,294023,294173,293019,291976,294923,294797,296958,294075,293450,296952,297185,295351,295736,296312,294330,292717,294638,294713,297176,295896,295137,296573,292236,294966,296642,296073,295903,293057,294628,292639,293803,294470,295353,297196,291752,296118,296964,296185,295338,295956,296064,295039,297201,297136,295206,295986,292172,294803,294480,294706,296975,296604,294493,293181,292526,293354,292374,292344,293744,294165,295082,296203,291918,295211,294289,294877,293120,295387))",
            "table_condition_attached": null,
            "access_type": "range"
          }
        ]

পার্শ্ব দ্রষ্টব্য: ট্রেসগুলির বাল্কনেসের কারণে আমার এটি প্রয়োজন:

@@global.optimizer_trace_max_mem_size = 32222;

3

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


3

নীচে মাইএসকিউএল 5.6 @ এসকিউএলফিডাল ব্যবহার করে 6 টি প্রশ্নের বিশদ রয়েছে

সংক্ষেপে 6 টি কোয়েরিগুলি স্বতন্ত্রভাবে সূচিকৃত কলামগুলিকে কভার করে এবং ডেটা টাইপ হিসাবে 2 টি কোয়েরি ব্যবহৃত হত। সমস্ত প্রশ্নের ফলাফল ইনএন () বা ওআরএস নির্বিশেষে একটি সূচক ব্যবহারের ফলে ঘটেছে।

        |   ORs      |   IN()
integer | uses index | uses index
date    | uses index | uses index
varchar | uses index | uses index

আমি সত্যিই কেবল বিবৃতিটি বাতিল করতে চেয়েছিলাম যার অর্থ হল কোনও সূচক ব্যবহার করা যাবে না। এটা সত্য নয়। সূচকগুলি নীচে উদাহরণস্বরূপ ডিসপ্লেতে qu টি কোয়েরি হিসাবে OR ব্যবহার করে ক্যোয়ারিতে ব্যবহার করা যেতে পারে।

এছাড়াও এটি আমার কাছে মনে হয় যে অনেকেই ওআর এর একটি সেটের জন্য একটি সিনট্যাক্স শর্টকাট many IN () -v- OR ব্যবহারের মধ্যে স্বল্প মাত্রায় পারফরম্যান্স পার্থক্য অত্যন্ত (ইনফিনটেসিনালি) প্রান্তিক।

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

6 এর সংক্ষিপ্ত বিবরণগুলি সমস্ত "সূচক শর্ত ব্যবহার করে" (ডানদিকে স্ক্রোল) ব্যাখ্যা করে

  Query               select_type    table    type    possible_keys      key      key_len   ref   rows   filtered           Extra          
                      ------------- --------- ------- --------------- ----------- --------- ----- ------ ---------- ----------------------- 
  Integers using OR   SIMPLE        mytable   range   aNum_idx        aNum_idx    4               10     100.00     Using index condition  
  Integers using IN   SIMPLE        mytable   range   aNum_idx        aNum_idx    4               10     100.00     Using index condition  
  Dates using OR      SIMPLE        mytable   range   aDate_idx       aDate_idx   6               7      100.00     Using index condition  
  Dates using IN      SIMPLE        mytable   range   aDate_idx       aDate_idx   6               7      100.00     Using index condition  
  Varchar using OR    SIMPLE        mytable   range   aName_idx       aName_idx   768             10     100.00     Using index condition  
  Varchar using IN    SIMPLE        mytable   range   aName_idx       aName_idx   768             10     100.00     Using index condition  

এসকিউএল ফিডল

মাইএসকিউএল 5.6 স্কিমা সেটআপ :

CREATE TABLE `myTable` (
  `id` mediumint(8) unsigned NOT NULL auto_increment,
  `aName` varchar(255) default NULL,
  `aDate` datetime,
  `aNum`  mediumint(8),
  PRIMARY KEY (`id`)
) AUTO_INCREMENT=1;

ALTER TABLE `myTable` ADD INDEX `aName_idx` (`aName`);
ALTER TABLE `myTable` ADD INDEX `aDate_idx` (`aDate`);
ALTER TABLE `myTable` ADD INDEX `aNum_idx` (`aNum`);

INSERT INTO `myTable` (`aName`,`aDate`)
 VALUES 
 ("Daniel","2017-09-19 01:22:31")
,("Quentin","2017-06-03 01:06:45")
,("Chester","2017-06-14 17:49:36")
,("Lev","2017-08-30 06:27:59")
,("Garrett","2018-10-04 02:40:37")
,("Lane","2017-01-22 17:11:21")
,("Chaim","2017-09-20 11:13:46")
,("Kieran","2018-03-10 18:37:26")
,("Cedric","2017-05-20 16:25:10")
,("Conan","2018-07-10 06:29:39")
,("Rudyard","2017-07-14 00:04:00")
,("Chadwick","2018-08-18 08:54:08")
,("Darius","2018-10-02 06:55:56")
,("Joseph","2017-06-19 13:20:33")
,("Wayne","2017-04-02 23:20:25")
,("Hall","2017-10-13 00:17:24")
,("Craig","2016-12-04 08:15:22")
,("Keane","2018-03-12 04:21:46")
,("Russell","2017-07-14 17:21:58")
,("Seth","2018-07-25 05:51:30")
,("Cole","2018-06-09 15:32:53")
,("Donovan","2017-08-12 05:21:35")
,("Damon","2017-06-27 03:44:19")
,("Brian","2017-02-01 23:35:20")
,("Harper","2017-08-25 04:29:27")
,("Chandler","2017-09-30 23:54:06")
,("Edward","2018-07-30 12:18:07")
,("Curran","2018-05-23 09:31:53")
,("Uriel","2017-05-08 03:31:43")
,("Honorato","2018-04-07 14:57:53")
,("Griffin","2017-01-07 23:35:31")
,("Hasad","2017-05-15 05:32:41")
,("Burke","2017-07-04 01:11:19")
,("Hyatt","2017-03-14 17:12:28")
,("Brenden","2017-10-17 05:16:14")
,("Ryan","2018-10-10 08:07:55")
,("Giacomo","2018-10-06 14:21:21")
,("James","2018-02-06 02:45:59")
,("Colt","2017-10-10 08:11:26")
,("Kermit","2017-09-18 16:57:16")
,("Drake","2018-05-20 22:08:36")
,("Berk","2017-04-16 17:39:32")
,("Alan","2018-09-01 05:33:05")
,("Deacon","2017-04-20 07:03:05")
,("Omar","2018-03-02 15:04:32")
,("Thaddeus","2017-09-19 04:07:54")
,("Troy","2016-12-13 04:24:08")
,("Rogan","2017-11-02 00:03:25")
,("Grant","2017-08-21 01:45:16")
,("Walker","2016-11-26 15:54:52")
,("Clarke","2017-07-20 02:26:56")
,("Clayton","2018-08-16 05:09:29")
,("Denton","2018-08-11 05:26:05")
,("Nicholas","2018-07-19 09:29:55")
,("Hashim","2018-08-10 20:38:06")
,("Todd","2016-10-25 01:01:36")
,("Xenos","2017-05-11 22:50:35")
,("Bert","2017-06-17 18:08:21")
,("Oleg","2018-01-03 13:10:32")
,("Hall","2018-06-04 01:53:45")
,("Evan","2017-01-16 01:04:25")
,("Mohammad","2016-11-18 05:42:52")
,("Armand","2016-12-18 06:57:57")
,("Kaseem","2018-06-12 23:09:57")
,("Colin","2017-06-29 05:25:52")
,("Arthur","2016-12-29 04:38:13")
,("Xander","2016-11-14 19:35:32")
,("Dante","2016-12-01 09:01:04")
,("Zahir","2018-02-17 14:44:53")
,("Raymond","2017-03-09 05:33:06")
,("Giacomo","2017-04-17 06:12:52")
,("Fulton","2017-06-04 00:41:57")
,("Chase","2018-01-14 03:03:57")
,("William","2017-05-08 09:44:59")
,("Fuller","2017-03-31 20:35:20")
,("Jarrod","2017-02-15 02:45:29")
,("Nissim","2018-03-11 14:19:25")
,("Chester","2017-11-05 00:14:27")
,("Perry","2017-12-24 11:58:04")
,("Theodore","2017-06-26 12:34:12")
,("Mason","2017-10-02 03:53:49")
,("Brenden","2018-10-08 10:09:47")
,("Jerome","2017-11-05 20:34:25")
,("Keaton","2018-08-18 00:55:56")
,("Tiger","2017-05-21 16:59:07")
,("Benjamin","2018-04-10 14:46:36")
,("John","2018-09-05 18:53:03")
,("Jakeem","2018-10-11 00:17:38")
,("Kenyon","2017-12-18 22:19:29")
,("Ferris","2017-03-29 06:59:13")
,("Hoyt","2017-01-03 03:48:56")
,("Fitzgerald","2017-07-27 11:27:52")
,("Forrest","2017-10-05 23:14:21")
,("Jordan","2017-01-11 03:48:09")
,("Lev","2017-05-25 08:03:39")
,("Chase","2017-06-18 19:09:23")
,("Ryder","2016-12-13 12:50:50")
,("Malik","2017-11-19 15:15:55")
,("Zeph","2018-04-04 11:22:12")
,("Amala","2017-01-29 07:52:17")
;

update MyTable
set aNum = id
;

প্রশ্ন 1 :

select 'aNum by OR' q, mytable.*
from mytable
where aNum = 12
OR aNum = 22
OR aNum = 27
OR aNum = 32
OR aNum = 42
OR aNum = 52
OR aNum = 62
OR aNum = 65
OR aNum = 72
OR aNum = 82

ফলাফল :

|          q | id |    aName |                aDate | aNum |
|------------|----|----------|----------------------|------|
| aNum by OR | 12 | Chadwick | 2018-08-18T08:54:08Z |   12 |
| aNum by OR | 22 |  Donovan | 2017-08-12T05:21:35Z |   22 |
| aNum by OR | 27 |   Edward | 2018-07-30T12:18:07Z |   27 |
| aNum by OR | 32 |    Hasad | 2017-05-15T05:32:41Z |   32 |
| aNum by OR | 42 |     Berk | 2017-04-16T17:39:32Z |   42 |
| aNum by OR | 52 |  Clayton | 2018-08-16T05:09:29Z |   52 |
| aNum by OR | 62 | Mohammad | 2016-11-18T05:42:52Z |   62 |
| aNum by OR | 65 |    Colin | 2017-06-29T05:25:52Z |   65 |
| aNum by OR | 72 |   Fulton | 2017-06-04T00:41:57Z |   72 |
| aNum by OR | 82 |  Brenden | 2018-10-08T10:09:47Z |   82 |

প্রশ্ন 2 :

select 'aNum by IN' q, mytable.*
from mytable
where aNum IN (
            12
          , 22
          , 27
          , 32
          , 42
          , 52
          , 62
          , 65
          , 72
          , 82
          )

ফলাফল :

|          q | id |    aName |                aDate | aNum |
|------------|----|----------|----------------------|------|
| aNum by IN | 12 | Chadwick | 2018-08-18T08:54:08Z |   12 |
| aNum by IN | 22 |  Donovan | 2017-08-12T05:21:35Z |   22 |
| aNum by IN | 27 |   Edward | 2018-07-30T12:18:07Z |   27 |
| aNum by IN | 32 |    Hasad | 2017-05-15T05:32:41Z |   32 |
| aNum by IN | 42 |     Berk | 2017-04-16T17:39:32Z |   42 |
| aNum by IN | 52 |  Clayton | 2018-08-16T05:09:29Z |   52 |
| aNum by IN | 62 | Mohammad | 2016-11-18T05:42:52Z |   62 |
| aNum by IN | 65 |    Colin | 2017-06-29T05:25:52Z |   65 |
| aNum by IN | 72 |   Fulton | 2017-06-04T00:41:57Z |   72 |
| aNum by IN | 82 |  Brenden | 2018-10-08T10:09:47Z |   82 |

প্রশ্ন 3 :

select 'adate by OR' q, mytable.*
from mytable
where aDate= str_to_date("2017-02-15 02:45:29",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2018-03-10 18:37:26",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2017-05-20 16:25:10",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2018-07-10 06:29:39",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2017-07-14 00:04:00",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2018-08-18 08:54:08",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2018-10-02 06:55:56",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2017-04-20 07:03:05",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2018-03-02 15:04:32",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2017-09-19 04:07:54",'%Y-%m-%d %h:%i:%s')
OR aDate = str_to_date("2016-12-13 04:24:08",'%Y-%m-%d %h:%i:%s')

ফলাফল :

|           q | id |    aName |                aDate | aNum |
|-------------|----|----------|----------------------|------|
| adate by OR | 47 |     Troy | 2016-12-13T04:24:08Z |   47 |
| adate by OR | 76 |   Jarrod | 2017-02-15T02:45:29Z |   76 |
| adate by OR | 44 |   Deacon | 2017-04-20T07:03:05Z |   44 |
| adate by OR | 46 | Thaddeus | 2017-09-19T04:07:54Z |   46 |
| adate by OR | 10 |    Conan | 2018-07-10T06:29:39Z |   10 |
| adate by OR | 12 | Chadwick | 2018-08-18T08:54:08Z |   12 |
| adate by OR | 13 |   Darius | 2018-10-02T06:55:56Z |   13 |

প্রশ্ন 4 :

select 'adate by IN' q, mytable.*
from mytable
where aDate IN (
          str_to_date("2017-02-15 02:45:29",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2018-03-10 18:37:26",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2017-05-20 16:25:10",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2018-07-10 06:29:39",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2017-07-14 00:04:00",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2018-08-18 08:54:08",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2018-10-02 06:55:56",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2017-04-20 07:03:05",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2018-03-02 15:04:32",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2017-09-19 04:07:54",'%Y-%m-%d %h:%i:%s')
        , str_to_date("2016-12-13 04:24:08",'%Y-%m-%d %h:%i:%s')
        )

ফলাফল :

|           q | id |    aName |                aDate | aNum |
|-------------|----|----------|----------------------|------|
| adate by IN | 47 |     Troy | 2016-12-13T04:24:08Z |   47 |
| adate by IN | 76 |   Jarrod | 2017-02-15T02:45:29Z |   76 |
| adate by IN | 44 |   Deacon | 2017-04-20T07:03:05Z |   44 |
| adate by IN | 46 | Thaddeus | 2017-09-19T04:07:54Z |   46 |
| adate by IN | 10 |    Conan | 2018-07-10T06:29:39Z |   10 |
| adate by IN | 12 | Chadwick | 2018-08-18T08:54:08Z |   12 |
| adate by IN | 13 |   Darius | 2018-10-02T06:55:56Z |   13 |

প্রশ্ন 5 :

select 'name by  OR' q, mytable.*
from mytable
where aname = 'Alan'
OR aname = 'Brian'
OR aname = 'Chandler'
OR aname = 'Darius'
OR aname = 'Evan'
OR aname = 'Ferris'
OR aname = 'Giacomo'
OR aname = 'Hall'
OR aname = 'James'
OR aname = 'Jarrod'

ফলাফল :

|           q | id |    aName |                aDate | aNum |
|-------------|----|----------|----------------------|------|
| name by  OR | 43 |     Alan | 2018-09-01T05:33:05Z |   43 |
| name by  OR | 24 |    Brian | 2017-02-01T23:35:20Z |   24 |
| name by  OR | 26 | Chandler | 2017-09-30T23:54:06Z |   26 |
| name by  OR | 13 |   Darius | 2018-10-02T06:55:56Z |   13 |
| name by  OR | 61 |     Evan | 2017-01-16T01:04:25Z |   61 |
| name by  OR | 90 |   Ferris | 2017-03-29T06:59:13Z |   90 |
| name by  OR | 37 |  Giacomo | 2018-10-06T14:21:21Z |   37 |
| name by  OR | 71 |  Giacomo | 2017-04-17T06:12:52Z |   71 |
| name by  OR | 16 |     Hall | 2017-10-13T00:17:24Z |   16 |
| name by  OR | 60 |     Hall | 2018-06-04T01:53:45Z |   60 |
| name by  OR | 38 |    James | 2018-02-06T02:45:59Z |   38 |
| name by  OR | 76 |   Jarrod | 2017-02-15T02:45:29Z |   76 |

প্রশ্ন 6 :

select 'name by IN' q, mytable.*
from mytable
where aname IN (
      'Alan'
     ,'Brian'
     ,'Chandler'
     , 'Darius'
     , 'Evan'
     , 'Ferris'
     , 'Giacomo'
     , 'Hall'
     , 'James'
     , 'Jarrod'
     )

ফলাফল :

|          q | id |    aName |                aDate | aNum |
|------------|----|----------|----------------------|------|
| name by IN | 43 |     Alan | 2018-09-01T05:33:05Z |   43 |
| name by IN | 24 |    Brian | 2017-02-01T23:35:20Z |   24 |
| name by IN | 26 | Chandler | 2017-09-30T23:54:06Z |   26 |
| name by IN | 13 |   Darius | 2018-10-02T06:55:56Z |   13 |
| name by IN | 61 |     Evan | 2017-01-16T01:04:25Z |   61 |
| name by IN | 90 |   Ferris | 2017-03-29T06:59:13Z |   90 |
| name by IN | 37 |  Giacomo | 2018-10-06T14:21:21Z |   37 |
| name by IN | 71 |  Giacomo | 2017-04-17T06:12:52Z |   71 |
| name by IN | 16 |     Hall | 2017-10-13T00:17:24Z |   16 |
| name by IN | 60 |     Hall | 2018-06-04T01:53:45Z |   60 |
| name by IN | 38 |    James | 2018-02-06T02:45:59Z |   38 |
| name by IN | 76 |   Jarrod | 2017-02-15T02:45:29Z |   76 |

2

আমি বাজি ধরব যে তারা একই রকম, আপনি নিম্নলিখিতটি প্রয়োগ করে একটি পরীক্ষা চালাতে পারেন:

"ইন (1,2,3,4)" 500 বার লুপ করুন এবং দেখুন এটি কতক্ষণ সময় নেয়। "= 1 বা = 2 বা = 3 ..." সংস্করণে 500 বার লুপ করুন এবং এটি কতক্ষণ চলবে তা দেখে।

আপনি জোড় উপায়ও চেষ্টা করতে পারেন, যদি কিছু ফিল্ড একটি সূচক হয় এবং আপনার টেবিলটি বড় হয় তবে এটি আরও দ্রুত হতে পারে ...

SELECT ... 
    FROM ... 
        INNER JOIN (SELECT 1 as newField UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) dt ON someFIELD =newField

আমি আমার এসকিউএল সার্ভারে উপরের যোগদানের পদ্ধতিটি চেষ্টা করেছিলাম এবং এটি (1,2,3,4) এর মতো প্রায় একই রকম এবং তারা উভয়ই একটি ক্লাস্টারড সূচীতে সন্ধান করে। আমি নিশ্চিত নই যে মাইএসকিউএল সেগুলি কীভাবে পরিচালনা করবে।



0

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


0

আমি জানি যে, যতক্ষণ আপনার মাঠে সূচি থাকবে ততক্ষণ বিটওয়াইন এটির দ্রুত এক প্রান্তটি সন্ধান করতে ব্যবহার করবে, তারপরে অপরটির দিকে যেতে হবে। এটি সবচেয়ে দক্ষ।

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


0

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

ওআর শর্তের সাথে অনুসন্ধানগুলি নীচের ক্ষেত্রে প্রয়োগের জন্য আরও বেশি সময় নিতে পারে।

  1. কার্যকর করতে মাইএসকিউএল অপ্টিমাইজার অন্য কোনও সূচককে দক্ষ হিসাবে বেছে নিয়েছে (মিথ্যা ইতিবাচক ক্ষেত্রে)।
  2. রেকর্ডের সংখ্যা যদি বেশি হয় (যেমন স্পষ্টভাবে জ্যাকব লিখেছেন)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.