LIKE
वाइल्डकार्ड के बिना वर्ण =
. के बराबर है . मान लें कि आपका वास्तव में मतलब था name = 'text'
।
सूचकांक प्रदर्शन की कुंजी हैं।
परीक्षण सेटअप
CREATE TABLE image (
image_id serial PRIMARY KEY
, group_id int NOT NULL
, name text NOT NULL
);
आदर्श रूप से, आप दो इंडेक्स बनाते हैं (प्राथमिक कुंजी के अतिरिक्त):
CREATE INDEX image_name_grp_idx ON image (name, group_id);
CREATE INDEX image_grp_idx ON image (group_id);
दूसरा मई डेटा वितरण और अन्य विवरणों के आधार पर आवश्यक नहीं है। यहां स्पष्टीकरण:
- क्या पहले फ़ील्ड पर प्रश्नों के लिए एक समग्र अनुक्रमणिका भी अच्छी है?
क्वेरी
यह सबसे तेज़ संभव होना चाहिए आपके मामले के लिए क्वेरी:
SELECT * FROM image WHERE name = 'name105' AND group_id = 10
UNION ALL
SELECT * FROM image WHERE name = 'name105'
UNION ALL
SELECT * FROM image WHERE group_id = 10
LIMIT 1;
एसक्यूएल फिडल.
LIMIT
खंड पूरी क्वेरी पर लागू होता है। पोस्टग्रेज काफी स्मार्ट है निष्पादित करने के लिए नहीं UNION ALL
. के बाद के चरण जैसे ही उसे LIMIT
. को संतुष्ट करने के लिए पर्याप्त पंक्तियां मिलती हैं . नतीजतन, पहले . में एक मैच के लिए SELECT
क्वेरी का, EXPLAIN ANALYZE
. का आउटपुट ऐसा दिखता है (दाईं ओर स्क्रॉल करें! ):
Limit (cost=0.00..0.86 rows=1 width=40) (actual time=0.045..0.046 rows=1 loops=1) Buffers: local hit=4 -> Result (cost=0.00..866.59 rows=1002 width=40) (actual time=0.042..0.042 rows=1 loops=1) Buffers: local hit=4 -> Append (cost=0.00..866.59 rows=1002 width=40) (actual time=0.039..0.039 rows=1 loops=1) Buffers: local hit=4 -> Index Scan using image_name_grp_idx on image (cost=0.00..3.76 rows=2 width=40) (actual time=0.035..0.035 rows=1 loops=1) Index Cond: ((name = 'name105'::text) AND (group_id = 10)) Buffers: local hit=4 -> Index Scan using image_name_grp_idx on image (cost=0.00..406.36 rows=500 width=40) (never executed) Index Cond: (name = 'name105'::text) -> Index Scan using image_grp_idx on image (cost=0.00..406.36 rows=500 width=40) (never executed) Index Cond: (group_id = 10) Total runtime: 0.087 ms
बोल्ड जोर मेरा।
नहीं करें एक ORDER BY
. जोड़ें खंड , यह प्रभाव शून्य हो जाएगा। फिर पोस्टग्रेज़ को शीर्ष पंक्ति पर लौटने से पहले सभी पंक्तियों पर विचार करना होगा।
अंतिम प्रश्न
<ब्लॉकक्वॉट>क्या इसका कोई सामान्य समाधान है?
यह है सामान्य समाधान। अधिक से अधिक SELECT
जोड़ें बयान जैसा आप चाहते हैं।
बेशक यह तब काम आएगा जब खोज परिणाम को उसकी प्रासंगिकता के अनुसार क्रमबद्ध किया जाएगा।
परिणाम में केवल एक पंक्ति है LIMIT 1
. के साथ . छँटाई के प्रकार।