Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Prośba o analizę zapytania
Forum PHP.pl > Forum > Przedszkole
krzesik
Witam, na potrzeby swojego projektu mam następujące zapytanie:

  1. SELECT t1.imie_nazwisko AS nazwisko, count(DISTINCT t1.id_book) AS iloscwpisow, SUM(t2.ilosc) AS iloscsztuk FROM tab1 AS t1, tab2 AS t2 WHERE t1.id_book=t2.id_book GROUP BY t1.imie_nazwisko
  2. UNION ALL
  3. SELECT t1.imie_nazwisko AS nazwisko, count(DISTINCT t1.id_book) AS iloscwpisow, 0 AS iloscsztuk FROM tab1 AS t1, tab2 AS t2 WHERE t1.id_book NOT IN (SELECT id_book FROM tab2) GROUP BY t1.imie_nazwisko


tabela tab1 zawiera ok 20.000 rekordów
tabela tab2 zawiera ok 5.000 rekordów

czas wykonywania zapytania do UNION-a trwa 0,007 s.
czas wykonywania zapytania po UNION-iea trwa prawie 11 s.

czy to zapytanie można zoptywalizować? Jeśli tak to poproszę o wskazówki
Pyton_000
wywal to ", tab2 AS t2 " z 2 zapytania bo nic nie wnosi dołączenie drugiej tabeli a łączy ją kartezjańsko z t1 czyli finalnie wychodzi 100 000 000 rekordów do przeszukania.
trueblue
Na t1.id_book i t2.id_book powinny być pozakładane indeksy (nie wiem jakie, bo nie wiem jaka relacja jest między tymi tabelami, ale najpewniej primary key na t1.id_book i indeks na t2.id_book).
Drugie podzapytanie można (i należy) zoptymalizować do LEFT JOIN.
krzesik
Ad. Trueblue
Generalnie nadal męczę się z tym co już mi pomagałeś
  1. SELECT
  2. IF(MONTH(`t2.`start`)>3,cast(CONCAT(YEAR(`t2.`start`), '/', YEAR(`t2.`start`)+1) as char),cast(CONCAT(YEAR(`t2.`start`)-1, '/', YEAR(`t2.`start`)) as char)) AS `sezon`,
  3. t2.start as data, t2.imie_nazwisko, count(distinct t2.id_book) as wizyty, sum(t1.ilosc) as ilosc
  4. FROM tabela1 AS t1,tabela2 AS t2
  5. WHERE t1.id_book=t2.id_book and sezon='2016/2017' group by t2.imie_nazwisko


Jak LEFT JOIN - em dołączyć do wyniku rekordy nieistniejące w tab2?
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.