Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównywanie wielu dat w jednym zapytaniu - problem z wydajnością
Forum PHP.pl > Forum > Bazy danych > MySQL
ppendel
Witam,

Mam do utworzenia zapytanie w którym muszę sprawdzić trzy daty pochodzące z dwóch tabel, czy znajdują się w jakimś przedziale.

Problem polega na tym, że warunkiem jest że co najmniej jedna z tych dat ma być zawarta w określonym zakresie, czyli:

(tabela1.date1 BETWEEN '2011-08-01' AND '2011-08-31') OR (tabela2.date2 BETWEEN '2011-08-01' AND '2011-08-31') OR (tabela2.date3 BETWEEN '2011-08-01' AND '2011-08-31').

Przy zapytaniu z OR czas wykonania zapytania oscyluje w okolicach 15s, natomiast przy sprawdzaniu jednej daty, bądź wszystkich z warunkiem AND czas wykonania zapytania wynosi 0,2-0,5s.

Czy ktoś wie, czy jest jakiś inny/efektywniejszy sposób na sprawdzenie tego warunku?
erix
Zamień datę na inta przechowującego timestamp i załóż nań indeks.
wookieb
A dlaczego przechowuje daty aż w 3 różnych polach? Jest jakiś cel?
Pokaż schemat tabel
  1. SHOW CREATE TABLE 'tabela'
maly_swd
pokaz lepiej cale zapytanie
Pilsener
Cytat
trzy daty pochodzące z dwóch tabel


Bo pewnie najpierw pobierasz całe tabele, a potem rzeźbisz w nich łerem, można zoptymalizować:

1. Należy dodać podzapytanie do FROM
2. Warunki do JOIN, które od razu pobiorą potrzebne rekordy. Jeśli dołączamy też jakąś tabelę tylko po to, by w niej poszukać to także jest to bez sensu (joina należy używać tylko po to, by pobrać jakieś dane i wyświetlić je na stronie, gdy potrzebujemy np. nazwy województwa a nie szukania po nazwie województwa).
3. Należy użyć podzapytania w WHERE.

Zapytanie mogłoby wyglądać np. tak:
  1. SELECT * FROM (
  2. SELECT * FROM tabela WHERE pole='warunek'
  3. ) AS tabela
  4. JOIN tabela2 ON tabela2.id = tabela.jakies_id AND pole2='warunek2'
  5. WHERE pole3 IN (SELECT ID FROM tabela3 WHERE pole3='warunek3')


I nie należy dołączać joinem dużych tabel, bo to strasznie spowalnia, lepiej już użyć dwóch zapytań.

I pamiętaj o indeksach na pola, po których szukasz lub łączysz.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.