Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Prośba o analizę zapytania
krzesik
post 23.11.2016, 19:44:24
Post #1





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Pyton_000
post 23.11.2016, 19:53:40
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 23.11.2016, 19:54:13
Post #3





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
krzesik
post 23.11.2016, 20:22:40
Post #4





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
trueblue
post 23.11.2016, 20:32:54
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


http://stackoverflow.com/questions/1869095...in-query-how-to


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.07.2025 - 10:05