আমি জানি আমি বেশ পুরনো প্রশ্ন পুনরুত্থিত, কিন্তু আমি সম্প্রতি এই সমস্যা গাড়ীতে আঘাত, কিন্তু কিছু প্রয়োজনীয় যে বৃহৎ নম্বরে দাঁড়িপাল্লা ভাল । কোনও বিদ্যমান পারফরম্যান্স ডেটা ছিল না, এবং যেহেতু এই প্রশ্নের বেশ খানিকটা মনোযোগ ছিল, তাই আমি ভেবেছিলাম যে আমি যা পেয়েছি তা পোস্ট করব।
যে সমাধানগুলি আসলে কাজ করেছিল তা হ'ল অ্যালেক্স ব্যারেটের ডাবল সাব-কোয়েরি /NOT IN পদ্ধতি ( বিল কারভিনের অনুরূপ ), এবং কাসনোইয়েরLEFT JOIN পদ্ধতি।
দুর্ভাগ্যক্রমে উপরোক্ত দুটি পদ্ধতিই খুব বড় মধ্যবর্তী অস্থায়ী সারণী তৈরি করে এবং কার্যকারিতা দ্রুত হ্রাস পায় কারণ মুছে ফেলা হচ্ছে না এমন রেকর্ডের সংখ্যা বৃহত্তর হয়।
অ্যালেক্স ব্যারেটের ডাবল সাব-কোয়েরি (ধন্যবাদ!) ব্যবহারের ক্ষেত্রে আমি যা স্থির করেছি তা <=পরিবর্তে ব্যবহার করে NOT IN:
DELETE FROM `test_sandbox`
WHERE id <= (
SELECT id
FROM (
SELECT id
FROM `test_sandbox`
ORDER BY id DESC
LIMIT 1 OFFSET 42
) foo
)
এটি এন-র রেকর্ডের OFFSETআইডি পেতে ব্যবহার করে এবং সেই রেকর্ড এবং সমস্ত পূর্ববর্তী রেকর্ড মুছে দেয়।
যেহেতু অর্ডার করা ইতিমধ্যে এই সমস্যাটির একটি অনুমান ( ORDER BY id DESC), <=এটি একটি উপযুক্ত ফিট fit
এটি আরও দ্রুত, যেহেতু সাবকুই দ্বারা উত্পন্ন অস্থায়ী সারণীতে এন রেকর্ডগুলির পরিবর্তে কেবল একটি রেকর্ড রয়েছে ।
পরীক্ষা ক্ষেত্রে
দুটি পরীক্ষার ক্ষেত্রে আমি তিনটি কার্য পদ্ধতি এবং উপরের নতুন পদ্ধতিটি পরীক্ষা করেছি।
উভয় পরীক্ষার ক্ষেত্রে 10000 বিদ্যমান সারি ব্যবহার করা হয়, যখন প্রথম পরীক্ষাটি 9000 রাখে (সবচেয়ে পুরানো 1000 কে মুছে দেয়) এবং দ্বিতীয় পরীক্ষায় 50 রাখে (সবচেয়ে প্রাচীন 9950 মুছে দেয়)।
+
| | 10000 TOTAL, KEEP 9000 | 10000 TOTAL, KEEP 50 |
+
| NOT IN | 3.2542 seconds | 0.1629 seconds |
| NOT IN v2 | 4.5863 seconds | 0.1650 seconds |
| <=,OFFSET | 0.0204 seconds | 0.1076 seconds |
+
মজার বিষয় হ'ল <=পদ্ধতিটি বোর্ড জুড়ে আরও ভাল পারফরম্যান্স দেখায়, তবে আসলে খারাপের পরিবর্তে আপনি যত বেশি রাখবেন তা আরও ভাল হয়।