किसी भी एप्लिकेशन के लिए अंगूठे का नियम यह है कि डीबी को वह काम करने दें जो वह अच्छी तरह से करता है:फ़िल्टरिंग, सॉर्टिंग और जॉइनिंग।
प्रश्नों को उनके स्वयं के कार्यों या वर्ग विधियों में अलग करें:
$men = $foo->fetchMaleUsers();
$women = $foo->fetchFemaleUsers();
अपडेट करें
मैंने एक पूर्ण तालिका स्कैन क्वेरी के स्टीवन के पोस्टग्रेएसक्यूएल प्रदर्शन को दो अलग-अलग अनुक्रमित प्रश्नों के रूप में दोगुना अच्छा प्रदर्शन किया और इसे MySQL (जो वास्तविक प्रश्न में उपयोग किया जाता है) का उपयोग करके नकल किया:
स्कीमा
CREATE TABLE `gender_test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`gender` enum('male','female') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26017396 DEFAULT CHARSET=utf8
मैंने लिंग प्रकार को VARCHAR(20) नहीं होने के कारण बदल दिया है क्योंकि यह इस कॉलम के उद्देश्य के लिए अधिक यथार्थवादी है, मैं एक प्राथमिक कुंजी भी प्रदान करता हूं जैसा कि आप एक मनमाना डबल मान के बजाय एक टेबल पर अपेक्षा करेंगे।
अनइंडेक्स किए गए परिणाम
mysql> select sql_no_cache * from gender_test WHERE gender = 'male';
12995993 rows in set (31.72 sec)
mysql> select sql_no_cache * from gender_test WHERE gender = 'female';
13004007 rows in set (31.52 sec)
mysql> select sql_no_cache * from gender_test;
26000000 rows in set (32.95 sec)
मुझे विश्वास है कि इसके लिए किसी स्पष्टीकरण की आवश्यकता नहीं है।
अनुक्रमित परिणाम
ALTER TABLE gender_test ADD INDEX (gender);
...
mysql> select sql_no_cache * from gender_test WHERE gender = 'male';
12995993 rows in set (15.97 sec)
mysql> select sql_no_cache * from gender_test WHERE gender = 'female';
13004007 rows in set (15.65 sec)
mysql> select sql_no_cache * from gender_test;
26000000 rows in set (27.80 sec)
यहां दिखाए गए परिणाम मूल रूप से हैं स्टीवन के डेटा से अलग। अनुक्रमित क्वेरी लगभग प्रदर्शन करती हैं पूर्ण तालिका स्कैन की तुलना में दोगुना तेज़। यह सामान्य ज्ञान स्तंभ परिभाषाओं का उपयोग करते हुए ठीक से अनुक्रमित तालिका से है। मैं PostgreSQL को बिल्कुल नहीं जानता, लेकिन स्टीवन के उदाहरण में समान परिणाम न दिखाने के लिए कुछ महत्वपूर्ण गलत कॉन्फ़िगरेशन होना चाहिए।
MySQL की तुलना में चीजों को बेहतर करने के लिए PostgreSQL की प्रतिष्ठा को देखते हुए, या कम से कम जितना अच्छा है, मुझे लगता है कि PostgreSql ठीक से उपयोग किए जाने पर समान प्रदर्शन प्रदर्शित करेगा।
यह भी ध्यान दें, इसी मशीन पर 52 मिलियन तुलना करने वाले लूप के लिए अत्यधिक सरलीकृत एक अतिरिक्त 7.3 सेकंड लेता है निष्पादित करने के लिए।
<?php
$N = 52000000;
for($i = 0; $i < $N; $i++) {
if (true == true) {
}
}
मुझे लगता है कि यह स्पष्ट है कि इस डेटा को देखते हुए बेहतर तरीका क्या है।