क्वेरी प्लान सह सुरू करा, नंतर सर्वात मोठा खर्च सारे करा। डेटाबेस खरोखर काय करत आहे हे पाहण्यासाठी EXPLAIN/ वापरा, योग्य जोडा, क्वेरीज काढून टाका आणि फक्त आवश्यक डेटा निवडा।
क्वेरी प्लान सह सुरू करा, नंतर सर्वात मोठा खर्च सारे करा। डेटाबेस खरोखर काय करत आहे हे पाहण्यासाठी EXPLAIN/ वापरा, योग्य जोडा, क्वेरीज काढून टाका आणि फक्त आवश्यक डेटा निवडा।
EXPLAIN ANALYZEEXPLAIN ANALYZE अंमलबजावणी योजना आणि खरे समय दाखवते. मोठ्या टेबलवर Seq Scan हे क्लासिक लाल झेंडा आहे:
EXPLAIN ANALYZE
SELECT * FROM orders WHERE customer_id = 42;
-- Seq Scan on orders (cost=0.00..18500 rows=120)
-- Filter: (customer_id = 42)
-- rows removed by filter: 999880 ← scanned the whole table!
इंडेक्स पूर्ण स्कॅन हा वेगवान लुकअप मध्ये बदलतो:
CREATE INDEX idx_orders_customer ON orders (customer_id);
-- Now: Index Scan using idx_orders_customer (cost=0.42..8.5 rows=120)
-- 1,000,000-row scan → ~120-row lookup
इंडेक्सला लिहिण्यावर खर्च आहे: प्रत्येक INSERT/UPDATE ला इंडेक्स अपडेट करावा लागतो, म्हणून तुम्ही फिल्टर/जॉइन/सॉर्ट करत असलेल्या कॉलमवर इंडेक्स करा — प्रत्येक कॉलमवर नाही. मिश्र इंडेक्स (customer_id, created_at) एक रचनेत WHERE customer_id = ? ORDER BY created_at सेवा देतो.
N+1 समस्या — सूचीसाठी एक क्वेरी, नंतर प्रत्येक पंक्तीसाठी एक — हा मंदीचा शीर्ष कारण आहे. याला eager loading, JOIN, किंवा batched IN (...) सह बदला:
-- N+1: 1 + 100 queries
SELECT * FROM orders; -- then per order: SELECT * FROM users WHERE id = ?
-- Fixed: one JOIN, only needed columns
SELECT o.id, o.total, u.name
FROM orders o JOIN users u ON u.id = o.user_id;
तसेच फक्त आवश्यक कॉलम निवडा (SELECT * टाळा) आणि LIMIT/keyset pagination सह पृष्ठांकन करा जेणेकरून तुम्ही कधीही लाखो पंक्ती लोड करत नाही.
डेटाबेस सर्वाधिक सामान्य अडचण आहे. प्लान वाचल्याने तुम्हाला अंदाज लावण्याऐवजी का क्वेरी हळू आहे हे सांगते; योग्य इंडेक्स, N+1 काढून टाकणे, आणि परिणाम सेट ट्रिम करणे नियमितपणे दुसरे-लांब क्वेरीज मिलीसेकंद मध्ये बदलतात — हार्डवेयर स्केल केल्याशिवाय.