লিমিট ব্যবহার করা কি কার্যকারিতা উন্নত করে এবং তা লক্ষণীয়?


11

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


2
LIMITদক্ষতার উন্নতি হয় এমন
কেসগুলির

উত্তর:


10

আপনি যদি LIMITপারফরম্যান্স উন্নত করতে সুবিধা নিতে চান তবে আপনার প্রয়োজন

  • আপনি যে তথ্য পুনরুদ্ধার করছেন তা বুঝুন
  • যথাযথ কলামগুলির যথাযথ সূচীকরণ
  • ক্যোয়ারী রিফ্যাকচারিংয়ের জন্য দায় গ্রহণ করুন
  • LIMITআগে ব্যবহারJOIN

আপনি যদি সেগুলি অর্কেস্টেট করতে পারেন তবে এই নীতিগুলি অনেক বেশি যেতে পারে।

এই ইউটিউব ভিডিওটি দেখে আমি এই ধারণাগুলি শিখেছি (ফরাসী উচ্চারণের মাধ্যমে সাবধানে শুনুন)

কয়েকটি ধারণাগুলি থেকে শীর্ষ 40 টি নিবন্ধ পাওয়ার বিষয়ে খুব শক্ত স্ট্যাকওভারফ্লো প্রশ্নের উত্তর দেওয়ার জন্য আমি এই ধারণাগুলি ব্যবহার করেছি: 12 ই মে, 2011: যোগদানের টেবিল থেকে একটি একক সারি আনতে হবে ।

এই প্রশ্নের উত্তরে (16 ই মে, 2011) , আমি নিম্নলিখিত কোয়েরিটি লিখেছি এবং এটির পুরোপুরি পরীক্ষা করেছি:

SELECT
  AAA.author_id,
  AAA.date_created,
  IFNULL(BBB.title,'<NO_TITLE>') title,
  IFNULL(CCC.filename,'<NO-IMAGE>') filename,
  IFNULL(CCC.date_added,'<NO-IMAGE-DATE>') image_date
FROM
(
  SELECT
    AA.id,
    AA.date_added,
    BB.author_id,
    BB.date_created
  FROM
  (
    SELECT
      A.id,IFNULL(MAX(B.date_added),'1900-01-01 00:00:00') date_added
      FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
      LEFT JOIN article_images B ON A.id = B.article_id
      GROUP BY A.id
  ) AA
  INNER JOIN articles BB USING (id)
) AAA
LEFT JOIN article_contents BBB ON AAA.id=BBB.article_id
LEFT JOIN article_images CCC
ON (AAA.id=CCC.article_id AND AAA.date_added=CCC.date_added)
ORDER BY AAA.date_created DESC;

দয়া করে কোয়েরিতে লাইনটি লক্ষ্য করুন LIMIT

      FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A

এই subquery তিন স্তর গভীর সমাহিত করা হয়। এটি আমাকে শেষ 40 টি নিবন্ধ ব্যবহার করে অনুমতি দিয়েছে LIMIT। তারপরে, আমি পরে প্রয়োজনীয় জিনগুলি সম্পাদন করেছি।

পাঠ শিখেছি

  • এরকম LIMITsubqueries ভিতরে সবসময় ইন্ডেক্সে cardinality, ডাটা বিষয়বস্তু, এবং থেকে ফলাফল সেট আকারের কারণ উত্তর হতে পারে LIMIT। আপনার যদি আপনার সমস্ত "পর পরের হাঁস" থাকে (আপনার প্রশ্নের জন্য চারটি নীতি মনে রাখবেন), আপনি আশ্চর্যরকম ভাল ফলাফল পেতে পারেন।
  • LIMITকেবল কীগুলি সংগ্রহ করার মাধ্যমে আপনার প্রশ্নগুলি যথাসম্ভব সরল করুন ।

এর (A [LEFT] JOIN B) LIMIT 100সমান (A LIMIT 100) [LEFT] JOIN (B LIMIT 100)? [LEFT] JOINবাহ্যিক বা অভ্যন্তরীণ যোগদানের অর্থ কোথায়
জিম 21

এটা আরও পছন্দ (A LIMIT 100) [LEFT] JOIN BLIMITফলাফলটি যত তাড়াতাড়ি সম্ভব সেট আকার নির্ধারণ করতে ব্যবহার করা ধারণা । আমি এর LEFT JOINপরিবর্তে এটিও ব্যবহার করি INNER JOINকারণ LEFT JOINবাম পাশের কীগুলি ক্রম সংরক্ষণ করবে।
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ জিম না, তারা নেই। কখনও কখনও, তারা (A LEFT JOIN B) GROUP BY A.pk LIMIT 100এগুলির মতো : সাধারণত পুনরায় লেখা যেতে পারে (A LIMIT 100) LEFT JOIN B GROUP BY A.pk(এখানে কোন অন্তর্ভুক্ত যোগদান নয়, অভ্যন্তরীণ যোগদানের সাথে তারা সমতুল্য হবে না)) রোল্যান্ডোর উদাহরণটি ঠিক এরকম একটি বিষয়।
ypercubeᵀᴹ

@ টিউবারকিউব: সুতরাং অভ্যন্তরীণ যোগদানের সাথে লিমিটেড থেকে উপকৃত হওয়ার জন্য কিছু করার নেই?
জিম 21

আমি রোল্যান্ডোর দ্বারা বর্ণিত পুনর্লিখনের কৌশলটি উল্লেখ করছিলাম। জোইনস এবং লিমিটেডের সাথে একটি ক্যোয়ারীও উপকার করতে পারে। অথবা না. এটা নির্ভর করে.
ypercubeᵀᴹ

2

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

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

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


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

ক্যোয়ারী এবং উপস্থিত সূচকগুলির উপর নির্ভর করে, GROUP BYসম্ভাব্যভাবে এমন কোনও পরিকল্পনার দিকে নিয়ে যেতে পারে যা অবরুদ্ধকারী অপারেটরদের না করে।
সেবাস্তিয়ান মেইন

0

আমার ক্ষেত্রে আমি হ্যাঁ বলতে পারি , যদিও আমি (এখনও) বুঝতে পারি না।

SELECT g0_.id AS id_0, COUNT(a1_.id_tarifs) AS sclr_1
FROM groupe_jardinerie g0_
INNER JOIN articles_tarifs a1_
  ON (a1_.groupe_jardinerie_id = g0_.id)
WHERE g0_.centrale_id = 511
  AND a1_.date_fin_tarif >= '2018-01-29 10:46:35'
GROUP BY g0_.id;

(result set)

8 rows in set (**18.14 sec**)

সময় নোট করুন: 18 সেকেন্ড। একটি বড় লিমিটের সাথে একই অনুরোধ:

SELECT g0_.id AS id_0, COUNT(a1_.id_tarifs) AS sclr_1 
FROM groupe_jardinerie g0_
INNER JOIN articles_tarifs a1_
  ON (a1_.groupe_jardinerie_id = g0_.id)
WHERE g0_.centrale_id = 511 
  AND a1_.date_fin_tarif >= '2018-01-29 10:46:35'
GROUP BY g0_.id
LIMIT 100000000000;

(exact same result set)

8 rows in set (**1.32 sec**)

দশগুণেরও বেশি দ্রুত !!!

উভয় অনুরোধের জন্য একই ফলাফলটি ব্যাখ্যা করুন।

+----+-------------+-------+------------+--------+---------------------------------------------------+---------+---------+------------------------------+--------+----------+----------------------------------------------+
| id | select_type | table | partitions | type   | possible_keys                                     | key     | key_len | ref                          | rows   | filtered | Extra                                        |
+----+-------------+-------+------------+--------+---------------------------------------------------+---------+---------+------------------------------+--------+----------+----------------------------------------------+
|  1 | SIMPLE      | a1_   | NULL       | ALL    | IDX_438010BBC10784EF                              | NULL    | NULL    | NULL                         | 795135 |    33.33 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | g0_   | NULL       | eq_ref | PRIMARY,IDX_9CA5CF6758A1D71F,IDX_9CA5CF67670C757F | PRIMARY | 4       | phs.a1_.groupe_jardinerie_id |      1 |    50.00 | Using where                                  |
+----+-------------+-------+------------+--------+---------------------------------------------------+---------+---------+------------------------------+--------+----------+----------------------------------------------+

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


ভয়াবহ, আপনি কোন সংস্করণ ব্যবহার করছেন এবং আপনি কী সরলিকৃত পরীক্ষার কেস তৈরি করতে পারেন?
ইভান ক্যারল

1
আপনার উত্তরটি কোনও নতুন উপকারের প্রমাণ দেয় না LIMIT। আপনার 1 ম ক্যোয়ারী 18 সেকেন্ডে একটি ফলাফল সেট দেয় runs প্রথম ক্যোয়ারীর কারণে ২ য় ক্যোয়ারীর সমস্ত ডেটা ইতিমধ্যে InnoDB বাফার পুলে ক্যাশ হয়েছে, সুতরাং অবশ্যই ২ য় ক্যোয়ারীটি আরও দ্রুত হতে হবে, এমনকি যদি আপনি মাইএসকিএল পুনরায় চালু করেন, প্রথম কোয়েরিটি চালান, মাইএসকিএল পুনরায় চালু করুন, এবং দ্বিতীয়টি চালান ক্যোয়ারী, আপনি একই ফলাফল পাবেন। । এর জন্য আরও ভাল ফলাফল LIMITপাওয়া থেকে কেবল আসে: 1) এর LIMITআগে JOIN, 2) সীমাবদ্ধভাবে সীমাবদ্ধ ASCবা DESC
রোল্যান্ডোমাইএসকিউএলডিবিএ 21

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