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

Mengapa kueri mysql ini (dengan is null check) lebih lambat dari yang lain ini?

Saya terkejut bahwa keduanya cepat. Saya sarankan menggantinya dengan exists :

SELECT COUNT(*)
FROM ips_usuario u  
WHERE EXISTS (SELECT 1 FROM ips_fatura f WHERE u.id = f.ips_usuario_id) OR
      EXISTS (SELECT 1 FROM ips_fatura f WHERE u.ips_usuario_id_titular = f.ips_usuario_id);

Dan untuk yang kedua:

SELECT COUNT(*)
FROM ips_usuario u  
WHERE EXISTS (SELECT 1 FROM ips_fatura f WHERE u.id = f.ips_usuario_id) OR
      (u.ips_usuario_id_titular IS NOT NULL AND
       EXISTS (SELECT 1 FROM ips_fatura f WHERE u.ips_usuario_id_titular = f.ips_usuario_id)
      )

Untuk keduanya, Anda menginginkan dua indeks:ips_fatura(ips_usuario_id) dan ips_fatura(ips_usuario_id_titular) . Anda dapat memeriksa penjelasannya untuk memastikan bahwa EXISTS sedang menggunakan indeks. Jika tidak, rilis MySQL yang lebih baru menggunakan indeks untuk IN :

SELECT COUNT(*)
FROM ips_usuario u  
WHERE u.id IN (SELECT f.ips_usuario_id FROM ips_fatura f) OR
      u.ips_usuario_id_titular IN (SELECT f.ips_usuario_id FROM ips_fatura f);

Dalam kedua kasus (EXISTS atau IN ) tujuannya adalah untuk melakukan "semi-join". Artinya, hanya mendenda baris pertama dengan kecocokan daripada semua kecocokan. Ini adalah efisiensi yang penting, karena memungkinkan kueri untuk menghindari penghapusan duplikasi.

Saya akan berspekulasi bahwa masalahnya adalah pengoptimalan or -- biasanya ini menghasilkan JOIN yang tidak efisien algoritma. Namun, mungkin MySQL pintar dalam kasus pertama Anda. Tetapi penambahan IS NULL ke meja luar membuangnya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghitung titik mana (lintang, bujur) yang berada dalam jarak tertentu di mysql?

  2. Bagaimana cara memilih pelanggan tertentu?

  3. Pulihkan Basis Data di WAMP

  4. MySQL 5.5.9 dan kesalahan pembuatan tabel Hibernate pada TYPE

  5. MySQL PHP count(*) mengembalikan sesuatu yang aneh