Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> USING TEMPORARY, kiedy występuje?
ktuvok
post
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

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


Czy ktoś może mi powiedzieć, jakie są zasady tworzenia przez MySQL tabel
tymczasowych przy wykonywaniu zapytań SELECT?

Spotykam się niejednokrotnie, że analiza zapytania (EXPLAIN SELECT ...)
ujawnia w kolumnie EXTRA wartość "USING TEMPORARY". Podejrzewam, że ma to
negatywny wpływ na wydajność.

Zapytanie mam takie:
  1. EXPLAIN SELECT
  2. Oddzialy.NazwaOddzialu,
  3. SUM(IF(DATE_FORMAT(Transakcje.DataWpisania,'%Y-%m-%d') = CURRENT_DATE,1,0))
  4. AS IloscTransakcjiWpisanych
  5. FROM Transakcje, Uzytkownicy, Oddzialy
  6. WHERE Transakcje.KtoWpisal = Uzytkownicy.IDUzyt AND Oddzialy.IDOddzialu = Uzytkownicy.IDOddzialu
  7. GROUP BY Oddzialy.IDOddzialu

a więc zupełnie proste... Ten IF jest nie do uniknięcia - zapytanie ma
zwracać sumę i ilość transakcji różnych typów, w powyższym przykładzie
pozostawiłem jedynie jedną kolumnę. Tak czy owak nawet powyższe zapytanie
generuje "USING TEMPORARY" dla tabeli Transakcje. Indeksy są na wszystkich
złączeniach, a mimo to MySQL nie korzysta z indeksu "KtoWpisal". Dlaczego?

MySQL 4.0.18

Pozdrawiam,
Krzysiek
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Moja propozycja
  1. SELECT Oddzialy.Nazwa, SUM(
  2. IF (
  3. DATE_FORMAT( Transakcje.DataWpisania, '%Y-%m-%d' ) = CURRENT_DATE, 1, 0 )
  4. ) AS ilosc
  5. FROM Oddzialy LEFT JOIN Uzytkownicy ON ( Oddzialy.IDOddzialu = Uzytkownicy.IDOddzialu )
  6. LEFT JOIN Transakcje ON ( Uzytkownicy.IDUzyt = Transakcje.KtoWpisal )
  7. GROUP BY Oddzialy.IDOddzialu
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 4.10.2025 - 20:51