কীভাবে মাইএসকিউএল অর্ডার বা লিমিটের মাধ্যমে কোনও প্রশ্নে প্রক্রিয়া করে?


250

আমার কাছে এমন একটি ক্যোয়ারী রয়েছে যা দেখতে এরকম দেখাচ্ছে:

SELECT article FROM table1 ORDER BY publish_date LIMIT 20

অর্ডার কীভাবে কাজ করে? এটি কি সমস্ত রেকর্ড অর্ডার করবে, তারপরে প্রথম 20 টি পাবে, বা এটি 20 টি রেকর্ড পাবে এবং publish_dateক্ষেত্রের দ্বারা তাদের অর্ডার করবে ?

এটি যদি সর্বশেষটি হয় তবে আপনাকে সাম্প্রতিকতম 20 টি নিবন্ধ পাওয়ার নিশ্চয়তা নেই te


6
মনে রাখবেন যে যদি কিছু publish_dateগুলি সমান হয় তবে সেগুলি দ্বারা আদেশ প্রদান নির্ধারিত ফলাফল দেয় না, এর অর্থ LIMITহ'ল আপনি যদি পৃষ্ঠাগুলির জন্য ব্যবহার করেন তবে আপনি বিভিন্ন পৃষ্ঠায় একই আইটেমগুলি পেয়ে শেষ করতে পারেন!
কনরাড মোরাউস্কি

উত্তর:


244

এটা প্রথম অর্ডার করবেন, অতঃপর এছাড়াও কিছু প্রক্রিয়া হবে প্রথম 20. একটি ডাটাবেসের পেতে WHEREআগে দফা ORDER BY


1
তাই সময় কি একই?
ইয়াসার আরাফাত

7
ভুল! LIMITবিরতি ORDER BY। সঙ্গে LIMITএকটি ORDER BYরিটার্ন ভুল ফলাফল। LIMITকোনওভাবে ফলাফল সেটটি পুনঃনির্ধারণ করেORDER BY
সবুজ

6
@ গ্রীন, আপনি ভুল করেছেন ব্যাখ্যার জন্য এটি পড়ুন: dev.mysql.com/doc/refman/5.7/en/limit-optimization.html যখন অর্ডার বাই কলামটি সূচী করা হয়, তখন এটি লিমিটেড ছাড়াই অন্য ক্রমে রেকর্ডগুলি ফিরিয়ে দিতে পারে, যখন আরও থাকে এই কলামে একই মান সহ 1 টিরও বেশি রেকর্ড।
ইয়িটওয়াইল

1
এই জাতীয় সমস্যার জন্য একটি দ্রুত সমাধান হ'ল অগ্রাধিকার অনুসারে অনন্য মানগুলি অর্ডার করার জন্য আরও একটি কলাম যুক্ত করা যাতে ডাটাবেস সারিগুলি অর্ডার করার জন্য একটি নিয়মিত নিয়ম পায় যখন প্রথম অর্ডার-বাই-কলামের মান একাধিক সারিগুলির জন্য সমান হয়।
রিনিজ

37

নির্বাচনী বিবৃতি দ্বারা প্রত্যাবর্তন করা সারিগুলির সংখ্যা সীমাবদ্ধ করতে LIMIT ধারাটি ব্যবহার করা যেতে পারে। LIMIT- এ এক বা দুটি সংখ্যার যুক্তি লাগে, যা উভয়ই nonnegative পূর্ণসংখ্যার ধ্রুবক হতে হবে (প্রস্তুত বিবৃতি ব্যবহার করার সময় ব্যতীত)।

দুটি যুক্তি সহ, প্রথম যুক্তিটি প্রথম সারির প্রত্যাবর্তনের অফসেট নির্দিষ্ট করে এবং দ্বিতীয়টি সর্বাধিক সংখ্যক সারি সরাতে নির্দিষ্ট করে। প্রাথমিক সারির অফসেটটি 0 (1 নয়):

SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15

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

SELECT * FROM tbl LIMIT 95,18446744073709551615;

একটি যুক্তি সহ, মান ফলাফল ফলাফলের শুরু থেকে ফিরে আসা সারিগুলির সংখ্যা নির্দিষ্ট করে:

SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows

অন্য কথায়, লিমিট সারি_কাউন্টটি লিমিটেড 0, সারি_কাউন্টের সমান।

সমস্ত বিবরণ এতে: http://dev.mysql.com/doc/refman/5.0/en/select.html


এটি কি 5-14 সারিগুলি পুনরুদ্ধার করে না?
অ্যাডোনিস কে। কাকুলিডিস

@ অ্যাডোনিস না, তা না। উদাহরণটি মাইএসকিউএল ডকুমেন্টেশন
ডেকাসওয়েল

5 নম্বরটি 6 তম সারিতে। 5 টি সারি (0 থেকে 4) উপেক্ষা করা হয়।
ফিল পেরি

1
তবে অর্ডার বাই লিমিট ব্যবহার করা অসঙ্গত ফলাফল দিতে পারে! দুর্ভাগ্যক্রমে, সম্পূর্ণ ফলাফল সেটটি অবশ্যই LTD প্রয়োগের আগেই অর্ডার করতে হবে বা DBMS নির্বিচারে ফলাফল অর্ডার করতে এবং তারপরে সেফটিতে অফসেট এবং LIMIT অবধি বাধ্য করতে হবে। আমি পড়েছি যে এটি হতে পারে ডিবিএমএস অফসেট এবং লিমিটেডের ভিত্তিতে একটি বিকল্প কোয়েরি প্ল্যান নির্বাচন করার কারণে এটি স্বেচ্ছাসেবী আদেশের কারণে হতে পারে।
বার্টন

4
প্রশ্নটি সীমা ও আদেশটি জিজ্ঞাসা করছে। তবে উত্তরটি এই প্রশ্নের সাথে মোটেই সম্পর্কিত নয়
শেন লিয়াং

9

ঠিক যেমন @ জেমস বলেছেন, এটি সমস্ত রেকর্ড অর্ডার করবে, তারপরে প্রথম 20 টি সারি পাবে।

যেমনটি হ'ল, আপনার 20 টি প্রথম প্রকাশিত নিবন্ধগুলি পাওয়ার গ্যারান্টি রয়েছে, নতুনগুলি প্রদর্শিত হবে না।

আপনার পরিস্থিতিতে, আমি আপনাকে যুক্ত descকরতে পরামর্শ দিচ্ছি order by publish_date, আপনি যদি নতুন নিবন্ধগুলি চান তবে সর্বশেষতম নিবন্ধটি প্রথমটি হবে।

যদি আপনাকে ফলাফলটিকে আরোহণের ক্রমে রাখার প্রয়োজন হয় এবং এখনও 10 টি নতুন নিবন্ধ চান তবে আপনি mysql কে আপনার ফলাফলকে দুইবার সাজানোর জন্য বলতে পারেন।

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

select t.article 
from 
    (select article, publish_date 
     from table1
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

আপনার যদি সমস্ত কলামের প্রয়োজন হয় তবে এটি এইভাবে করা হবে:

select t.* 
from 
    (select * 
     from table1  
     order by publish_date desc limit 10) t 

order by t.publish_date asc;

আমি এই কৌশলটি ব্যবহার করি যখন আমি ম্যানুয়ালি বিভিন্ন বিষয়ের জন্য ডেটাবেস পরীক্ষা করার জন্য প্রশ্ন লিখি। আমি এটি উত্পাদন পরিবেশে ব্যবহার করি নি, তবে এখন যখন আমি এটির বেঞ্চ চিহ্নিত করেছি, অতিরিক্ত বাছাইয়ের ফলে কর্মক্ষমতা প্রভাবিত হয় না।


2
আপনার অতিরিক্ত বাছাইয়ের ফলে কার্য সম্পাদনে কার্যত কোনও পরিমাপযোগ্য প্রভাব থাকতে পারে না কারণ এটি কেবলমাত্র 10 টি সারি / আইটেমের মধ্যে সীমাবদ্ধ :-)। সাধারণভাবে ইন-মেমরি টেবিলটি সাজানোর (যা একটি উপ-নির্বাচন উত্পাদন করছে) খুব দ্রুত এবং সবেমাত্র পরিমাপযোগ্য যদি না আপনার কাছে কয়েক মিলিয়ন সারি থাকে বা DBMS ডিস্কে ফল সেট করে তবে এটি মেমরিটির সাথে খাপ খায় না (যে ক্ষেত্রে ডিবিএমএসের উপর নির্ভর করে এটি ক্যোয়ারীটি বাতিল করতে পারে)।
মার্টিন কার্স্টেন

7

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

এটি সম্পর্কে ২০০৯ সাল থেকে একটি মাইএসকিউএল পারফরম্যান্স ব্লগ নিবন্ধ রয়েছে


7

অর্ডার শেষে আপনি [এসিসি] বা [ডেস্ক] যুক্ত করতে পারতেন প্রাথমিক বা সর্বশেষ রেকর্ড পেতে

উদাহরণস্বরূপ, এটি আপনাকে সর্বশেষতম রেকর্ডগুলি দেবে

ORDER BY stamp DESC

এর LIMITপরে ধারা যুক্ত করুনORDER BY


3
স্ট্যাকওভারফ্লোতে স্বাগতম। আমি মনে করি আপনি প্রশ্নটি ভুল বুঝে থাকতে পারেন। আমি বিশ্বাস করি তারা "কীভাবে বাছাই করবেন" তার চেয়ে অপারেশনগুলির ক্রম সম্পর্কে জিজ্ঞাসা করেছিলেন। (যেহেতু প্রশ্ন ইতিমধ্যে একটি সময় আগে উত্তর দেওয়া হয়েছিল কিন্তু এটা তর্ক করা হয়;)
লে

5

আপনি এই কোডটি ব্যবহার করতে পারেন SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10 যেখানে 0 রেকর্ডের শুরুর সীমা এবং রেকর্ডের 10 নম্বর


8
না যে প্রয়োজন হয় না । LIMIT 10জন্য সাধারণভাবে সংক্ষেপে হয় LIMIT 0,10
লরেন্স ডল

2
হ্যাঁ, সীমাবদ্ধতার জন্য
0,10

3

সাধারণত সীমাবদ্ধতা সর্বশেষ অপারেশন হিসাবে প্রয়োগ করা হয়, সুতরাং ফলাফলটি প্রথমে বাছাই করা হবে এবং তারপরে ২০-এ সীমাবদ্ধ থাকবে first বাস্তবে, প্রথম 20 বাছাই করা ফলাফল পাওয়া মাত্রই বাছাই বন্ধ হবে।


11
আপনার দ্বিতীয় বাক্যটি আপনার প্রথমটির বিপরীতে। প্রথম 20 টি ফলাফল পাওয়া গেলে বাছাই বন্ধ করতে পারে না কারণ আপনি বলেছিলেন ফলাফলগুলি ফিরে আসার আগে বাছাই করা হবে। মাইএসকিউএল কেবলমাত্র জানতে পারে বাছাই শেষ হওয়ার পরে প্রথম 20 ফলাফলগুলি কী।
টম

@ টম, আসলে এটি সূচকযুক্ত কলাম দ্বারা অর্ডার করাতে পারে if এটি এখানে ব্যাখ্যা করা হয়েছে: dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
ywwail

-3

এছাড়াও ডাটাবেস অনুযায়ী LIMIT এর বাক্য গঠন পৃথক, উদাহরণস্বরূপ:

mysql - সীমা 1, 2

postgres - সীমাবদ্ধ 2 অফসেট 1

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