মাইএসকিউএল ডেটা - পেজিং বাস্তবায়নের সেরা উপায়?


208

আমার আইফোন অ্যাপ্লিকেশনটি একটি মাইএসকিউএল ডাটাবেস থেকে ডেটা পুনরুদ্ধার করতে আমার পিএইচপি ওয়েব পরিষেবাতে সংযুক্ত। একটি অনুরোধ 500 ফলাফল দিতে পারে।

পেজিং বাস্তবায়ন এবং একবারে 20 টি আইটেম পুনরুদ্ধার করার সর্বোত্তম উপায় কী?

ধরা যাক আমি আমার ডাটাবেস থেকে প্রথম 20 টি বিজ্ঞাপন পেয়েছি। এখন আমি কীভাবে পরবর্তী 20 টি বিজ্ঞাপনের জন্য অনুরোধ করতে পারি?

উত্তর:


309

মাইএসকিউএল ডকুমেন্টেশন থেকে :

নির্বাচনী বিবৃতি দ্বারা প্রত্যাবর্তন করা সারিগুলির সংখ্যা সীমাবদ্ধ করতে 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, সারি_কাউন্টের সমান।


107
পেজিংয়ের জন্য লিমিট ব্যবহার করার সময় আপনার একটি অর্ডার বাইও নির্দিষ্ট করা উচিত।
মার্ক বাইয়ার্স

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

13
যাইহোক, বড় ফলসেটগুলি যখন পৃষ্ঠাতেঙ্কিত করা হয় (এবং সেই জন্য পৃষ্ঠাগুলিটি কী - বড় ফলসেটগুলি ছোট অংশগুলিতে বিভক্ত করে তোলে, ডান?), আপনার মনে রাখা উচিত যে আপনি যদি এটি করেন তবে limit X, Yমূলত কী ঘটে তা হল এক্স + ওয়াই সারিগুলি পুনরুদ্ধার করা হবে এবং তারপরে শুরু থেকে এক্স সারি বাদ দেওয়া হয় এবং যা কিছু অবশিষ্ট থাকে তা ফিরে আসে। পুনরাবৃত্তি করতে: limit X, Yএক্স + ওয়াই সারিগুলির স্ক্যানের ফলাফল।
শাইলেন্ট

7
আমি আপনার লিমিটেড 95, 18446744073709551615 ধারণা পছন্দ করি না .. একবার OFFSETদেখুন ;-)
চার্লসলেফ

5
বড় ডেটা নিয়ে কাজ করার সময় এটি দক্ষ হয় না। কোডুলার.আইপিপ্লিমেন্টিং-পৃষ্ঠাটি পরীক্ষা করুন যা একাধিক উপায়ে নির্দিষ্ট দৃশ্যের জন্য উপযুক্ত।
অমিত

125

500 রেকর্ডের জন্য দক্ষতা সম্ভবত কোনও সমস্যা নয়, তবে আপনার যদি মিলিয়ন রেকর্ড রয়েছে তবে পরের পৃষ্ঠাটি নির্বাচন করার জন্য WHERE ধারাটি ব্যবহার করা সুবিধাজনক হতে পারে:

SELECT *
FROM yourtable
WHERE id > 234374
ORDER BY id
LIMIT 20

"234374" এখানে আপনি যে বিস্তৃত পৃষ্ঠাগুলি দেখেছেন তা শেষ রেকর্ডের আইডি।

এটি প্রথম রেকর্ড খুঁজে পেতে আইডিতে একটি সূচককে সক্ষম করবে। আপনি যদি ব্যবহার করেন তবে LIMIT offset, 20দেখতে পেলেন যে আপনি পৃষ্ঠার শেষের দিকে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়তে পারেন । যেমনটি আমি বলেছি, আপনার কাছে কেবল 200 রেকর্ড থাকলে এটি সম্ভবত কিছু যায় আসে না, তবে এটি বড় ফলাফলের সেটগুলির সাথে একটি পার্থক্য করতে পারে।

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

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


1
এটি এর মতো আরও রয়েছে: পি যদিও আমি এই বিষয়টি পুরোপুরি অস্বীকার করি, তবে 'পুরানো'দের চেয়ে' নতুন 'আইডিগুলি সর্বদা বড় থাকে, বেশিরভাগ সময় সত্যই এটি ঘটে থাকে এবং তাই আমার মনে হয়, এটি' ভাল ' যথেষ্ট'. যাইহোক, হ্যাঁ, আপনি যেমনটি দেখিয়েছেন, যথাযথ পৃষ্ঠাগুলি (বড় ফলাফলের উপর তীব্র কর্মক্ষমতা হ্রাস ছাড়াই) বিশেষভাবে তুচ্ছ এবং লেখা limit 1000000, 10এবং আশা করি না যে এটি কার্যকর হবে আপনার কোথাও পাবেন না।
শাইলেন্ট

1
দেরী দেখার লিঙ্কটি খুব দরকারী
pvgoddijn

1
আপনি যদি আইডি অর্ডার দেওয়ার জন্য "ডিইএসসি" ব্যবহার করেন তবে এই পৃষ্ঠাটি পিছনের দিকে কাজ করে। আমি এটা পছন্দ করি!
ডেনিস হেইডেন

2
কিন্তু লোকেরা কতবার আইডি দ্বারা বা, ক্ষোভ দ্বারা, বাস্তব বিশ্বে "তারিখ তৈরি করা" দ্বারা অর্ডার করতে চায়?
রিচিএইচএইচ

ভাল পোস্ট, তবে area=width*heightএটি কেবল রেকর্ডগুলির পরিমাণের চেয়ে বেশি পরিমাণে নয়, তবে প্রতিটি রেকর্ডের আকার মেমরির ফলাফলগুলি সংরক্ষণ করার সময় একটি
কারণও রয়েছে

43

ক্যোয়ারির জন্য অফসেট সংজ্ঞা দিন । উদাহরণ স্বরূপ

পৃষ্ঠা 1 - (রেকর্ড 01-10): অফসেট = 0, সীমা = 10;

পৃষ্ঠা 2 - (রেকর্ড 11-20) অফসেট = 10, সীমা = 10;

এবং নিম্নলিখিত কোয়েরি ব্যবহার করুন:

SELECT column FROM table LIMIT {someLimit} OFFSET {someOffset};

পৃষ্ঠার জন্য উদাহরণ 2:

SELECT column FROM table
LIMIT 10 OFFSET 10;

1
আপনি কি পৃষ্ঠা -2 এর জন্য অফসেট = 10 বোঝাতে চাইছেন না?
জেনা মাইজ

28

এটি সম্পর্কে সাহিত্য আছে:

মূল সমস্যাটি বড় আকারের ব্যবহারের সাথে ঘটে OFFSET। তারা OFFSETবিভিন্ন কৌশল ব্যবহার করে, এগুলির idমধ্যে ব্যাপ্তি নির্বাচন থেকে শুরু করে avoidWHERE করে কোনও ধরণের ক্যাচিং বা প্রাক-কম্পিউটিং পৃষ্ঠাগুলি

আইএনডেক্স, লূক ব্যবহারের প্রস্তাবিত সমাধান রয়েছে :


1
জটিল প্রশ্নের প্রতিটি পেজিং ক্যোয়ারির জন্য সর্বাধিক আইডি জিট করা ফলস্বরূপ অ ব্যবহারিক, অ প্রযোজনা ব্যবহারের র‌্যাঙ্ক, সারি সংখ্যা এবং ক্লজ ধরণের পেজিংয়ের মধ্যে পারফরমেন্সে সহায়তা করে!
রিজওয়ান প্যাটেল

সেই কৌশলটি বিবেচনায় নেওয়া হয় এবং সরবরাহিত লিঙ্কগুলিতে সঠিকভাবে মূল্যায়ন করা হয়। এটি মোটেও সহজ নয়।
লুচোস্টাইন

প্রদত্ত লিঙ্কটি কেবল বেস পাইভট ইউনি-পিভট, ক্রস অ্যাপ্লিকেশন, মাল্টি সিটিই বা উত্পন্ন টেবিল মেকানিক্স পূরণ করতে পারে? আবার আমি সর্বোচ্চ ক্ষেত্রে পাওয়ার জন্য আবার এরকম বিশালতায় পুনরায় লেখার প্রশ্ন নিয়ে আমার মামলার পাশে দাঁড়ান আর্কিটেকচারাল ওভারকিল! এবং তারপরে আবার ক্রম আদেশ এবং এন "সংখ্যার কলামের জন্য সাজানোর আদেশ!
রিজওয়ান প্যাটেল

1
আমি কী ভুল বোঝাবুঝি করছি যে "প্যাজিনেশন সঠিকভাবে সম্পন্ন হয়েছে" লিঙ্কটি, বা ফিল্টারিংয়ের সাথে জড়িত কোনও প্রশ্নের মধ্যে এটি কেবল অবাস্তব।
পরিচিতিমেট

1
@ কনট্যাকটম্যাট আমি আপনার দৃ ap়তা ভাগ করি। শেষ পর্যন্ত, মনে হয় দক্ষতার সাথে পুরো প্রয়োজনীয়তার প্রয়োগ করার কোনও উপায় নেই, তবে আসলটির চারপাশে শিথিল বৈচিত্রগুলি।
লুচোস্টাইন

13

এই টিউটোরিয়ালটি পৃষ্ঠাগুলি করার দুর্দান্ত উপায় দেখায়। মাইএসকিউএল ব্যবহার করে দক্ষ পৃষ্ঠাগুলি

সংক্ষেপে, অফসেট বা বৃহত লিমিট ব্যবহার করা এড়িয়ে চলুন


24
একটি সংক্ষিপ্তসার দিতে পারে?
অ্যান্ড্রু

হ্যাঁ, আমি উত্তরে আরও প্রচেষ্টা প্রশংসা করব।
জোরকাইন্ড

6

আপনি করতে পারেন

SELECT SQL_CALC_FOUND_ROWS * FROM tbl limit 0, 20

নির্বাচিত বিবৃতিটির সারি গণনা (সীমা ছাড়াই) একই নির্বাচিত বিবৃতিতে ক্যাপচার করা হয় যাতে আপনাকে আবার সারণির আকারের জিজ্ঞাসা করতে হবে না। আপনি SELECT FOUND_ROWS () ব্যবহার করে সারি গণনা পান;


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

তুমি কি নিশ্চিত? আমি একটি বড় টেবিল SQL_CALC_FOUND_ROWS এবং অন্য কোনও কোয়েরি ব্যবহার না করে তার বিপরীতে জিজ্ঞাসা করেছি d আমি কোন সময় পার্থক্য দেখেছি। 2 টি ক্যোয়ারী করার চেয়ে দ্রুত কোনও উপায়। 1 - সক্ষমযোগ্য সীমা 0 20 থেকে * নির্বাচন করুন এবং তারপরে অযোগ্য থেকে গণনা (*) নির্বাচন করুন।
সুরজ

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

এছাড়াও এখানে
স্ট্যাকওভারফ্লো

4

প্রশ্ন 1: SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500

প্রশ্ন 2: SELECT * FROM tbl LIMIT 0,500;

কোয়েরি 1 ছোট বা মাঝারি রেকর্ডগুলির সাথে দ্রুত চালান, রেকর্ডের সংখ্যা 5000 বা তারও বেশি সমান হলে ফলাফল একই রকম হয়।

500 টি রেকর্ডের জন্য ফলাফল:

ক্যোয়ারি 1টি 9.9999904632568 মিলিসেকেন্ডে নেবে

কোয়েরি 2 19.999980926514 মিলিসেকেন্ডে নেবে

8,000 রেকর্ডের জন্য ফলাফল:

কোয়েরি 1 129.99987602234 মিলি সেকেন্ড নেয়

ক্যোয়ারি 2 160.00008583069 মিলিসেকেন্ডে নেবে


আপনার একটি সূচি লাগানো দরকার id
মার্টেন

6
কিভাবে id > 0দরকারী?
মিশেল জং

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

ধন্যবাদ, আমি যেমন আপনার উত্তরটি দেখতে পাইনি, ঠিক কোথায়, অর্ডার এবং সীমাটি আসে
সেদিকে আমার কেবল সরেজমিন দেখা দরকার

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

0

একক টেবিল থেকে ডেটা আনার সময় পেজিং করা সহজ তবে যখন এটি একাধিক টেবিলগুলিতে যোগদানের ডেটা পুনরুদ্ধার করে তখন জটিল। মাইএসকিউএল এবং স্প্রিংয়ের সাথে এখানে একটি ভাল উদাহরণ রয়েছে:
https://www.easycodeforall.com/zpagination1.jsp


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