Aturan praktis untuk aplikasi apa pun adalah membiarkan DB melakukan hal-hal yang dilakukannya dengan baik:memfilter, menyortir, dan bergabung.
Pisahkan kueri ke dalam fungsi atau metode kelasnya sendiri:
$men = $foo->fetchMaleUsers();
$women = $foo->fetchFemaleUsers();
Perbarui
Saya mengambil demonstrasi PostgreSQL Steven tentang kueri pemindaian tabel lengkap yang berkinerja dua kali lebih baik dari dua kueri terindeks terpisah dan menirunya menggunakan MySQL (yang digunakan dalam pertanyaan aktual):
Skema
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
Saya mengubah jenis gender menjadi bukan VARCHAR(20) karena lebih realistis untuk tujuan kolom ini, saya juga memberikan kunci utama seperti yang Anda harapkan pada tabel alih-alih nilai DOUBLE arbitrer.
Hasil Tidak Terindeks
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)
Saya percaya ini tidak perlu penjelasan.
Hasil yang Diindeks
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)
Hasil yang ditampilkan di sini secara radikal berbeda dengan data Steven. Kueri yang diindeks berkinerja hampir dua kali lebih cepat dari pemindaian tabel penuh. Ini dari tabel yang diindeks dengan benar menggunakan definisi kolom akal sehat. Saya tidak tahu PostgreSQL sama sekali, tetapi pasti ada kesalahan konfigurasi yang signifikan dalam contoh Steven agar tidak menunjukkan hasil yang serupa.
Mengingat reputasi PostgreSQL untuk melakukan hal-hal yang lebih baik daripada MySQL, atau setidaknya sebaik, saya berani mengatakan bahwa PostgreSql akan menunjukkan kinerja yang serupa jika digunakan dengan benar.
Perhatikan juga, pada mesin yang sama ini, loop for yang terlalu disederhanakan melakukan 52 juta perbandingan membutuhkan tambahan 7,3 detik untuk dieksekusi.
<?php
$N = 52000000;
for($i = 0; $i < $N; $i++) {
if (true == true) {
}
}
Saya rasa sudah cukup jelas pendekatan apa yang lebih baik dengan data ini.