Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah lebih baik memfilter kumpulan hasil menggunakan klausa WHERE atau menggunakan kode aplikasi?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Buat Database MySQL dengan .SQL File

  2. 60 juta entri, pilih entri dari bulan tertentu. Bagaimana cara mengoptimalkan basis data?

  3. Bagaimana membandingkan dua kolom untuk menemukan catatan yang tidak cocok di MySQL

  4. COALESCE di laravel

  5. Bagaimana cara mengatur MySQL untuk sementara menjadi hanya-baca melalui baris perintah?