Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dlaczego to zapytanie mysql (z is null check) jest tak wolniejsze niż to drugie?

Dziwię się, że albo jest szybki. Sugerowałbym zastąpienie ich przez 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);

A po drugie:

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)
      )

Dla obu tych potrzebujesz dwóch indeksów:ips_fatura(ips_usuario_id) i ips_fatura(ips_usuario_id_titular) . Możesz sprawdzić wyjaśnienie, aby upewnić się, że EXISTS używa indeksu. Jeśli nie, nowsze wersje MySQL używają indeksów dla 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);

W obu przypadkach (EXISTS lub IN ) celem jest wykonanie „częściowego połączenia”. Oznacza to, że wystarczy dopasować tylko pierwszy wiersz, a nie wszystkie dopasowania. Jest to ważna wydajność, ponieważ pozwala uniknąć usunięcia duplikatów zapytania.

Spekulowałbym, że problemem jest optymalizacja or -- zwykle skutkuje to nieefektywnym JOIN algorytmy. Jednak być może MySQL jest sprytny w twoim pierwszym przypadku. Ale dodanie IS NULL do zewnętrznego stołu zrzuca go.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Pobierz X ostatnich wpisów z „niestandardowego” post_type liczenie użytkowników indywidualna liczba niestandardowego post_type

  2. Pierwsze logowanie:HTTP Status 500 — przetwarzanie żądania nie powiodło się; zagnieżdżony wyjątek to org.springframework.transaction.CannotCreateTransactionException

  3. Jak używać w klauzuli w podzapytaniu

  4. CakePHP 3 NIE może połączyć się z bazą danych z powodu brakującego rozszerzenia PHP

  5. jak zmienić limit czasu dla trwałych połączeń mysql