मैंने इसे अलग-अलग शिष्टाचारों में आज़माया और मुझे जो सबसे अच्छा प्रदर्शन मिला, वह यह सरल प्रश्न था:
select a.id+1 gapIni
,(select x.id-1 from arrc_vouchers x where x.id>a.id+1 limit 1) gapEnd
from arrc_vouchers a
left join arrc_vouchers b on b.id=a.id+1
where b.id is null
order by 1
;
... एक बाईं ओर जुड़ने के लिए जाँच करें कि क्या अगला आईडी मौजूद है, केवल अगर अगला नहीं मिला है, तो उपकुंजी अगली आईडी ढूंढें जो अंतराल के अंत का पता लगाने के लिए मौजूद है। मैंने ऐसा किया क्योंकि बराबर (=) के साथ क्वेरी (>) ऑपरेटर से अधिक से बेहतर प्रदर्शन है ।
Sqlfiddle का उपयोग करके यह दूसरों के क्वेरी के इतने अलग-अलग प्रदर्शन नहीं दिखाती है, लेकिन एक वास्तविक डेटाबेस में यह क्वेरी दूसरों के मुकाबले 3 गुना अधिक तेजी से होती है।
स्कीमा:
CREATE TABLE arrc_vouchers (id int primary key)
;
INSERT INTO `arrc_vouchers` (`id`) VALUES (1),(4),(5),(7),(8),(9),(10),(11),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29)
;
प्रदर्शन की तुलना करने के लिए मेरे द्वारा की गई सभी क्वेरी का अनुसरण करें:
select a.id+1 gapIni
,(select x.id-1 from arrc_vouchers x where x.id>a.id+1 limit 1) gapEnd
from arrc_vouchers a
left join arrc_vouchers b on b.id=a.id+1
where b.id is null
order by 1
;
select *, (gapEnd-gapIni) qt
from (
select id+1 gapIni
,(select x.id from arrc_vouchers x where x.id>a.id limit 1) gapEnd
from arrc_vouchers a
order by id
) a where gapEnd <> gapIni
;
select id+1 gapIni
,(select x.id from arrc_vouchers x where x.id>a.id limit 1) gapEnd
#,coalesce((select id from arrc_vouchers x where x.id=a.id+1),(select x.id from arrc_vouchers x where x.id>a.id limit 1)) gapEnd
from arrc_vouchers a
where id+1 <> (select x.id from arrc_vouchers x where x.id>a.id limit 1)
order by id
;
select id+1 gapIni
,coalesce((select id from arrc_vouchers x where x.id=a.id+1),(select x.id from arrc_vouchers x where x.id>a.id limit 1)) gapEnd
from arrc_vouchers a
order by id
;
select id+1 gapIni
,coalesce((select id from arrc_vouchers x where x.id=a.id+1),concat('*** GAT *** ',(select x.id from arrc_vouchers x where x.id>a.id limit 1))) gapEnd
from arrc_vouchers a
order by id
;
शायद यह किसी को मदद करता है और उपयोगी है।
आप इस sqlfiddle का उपयोग करके मेरी क्वेरी देख और परीक्षण कर सकते हैं :
http://sqlfiddle.com/#!9/6bdca7/1