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
ktuvok
post
Post #2





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

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


Oczywiście, ale niestety nie dysponuję serwerem dostępnym dla juzerów spoza firmy. Strukturę bazy w zakresie, który może być istotny, wklejam więc poniżej:

  1. CREATE TABLE `Transakcje` (
  2. `IDTransakcji` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `Status` enum('N','E','B','Z','O','G','U','R') NOT NULL DEFAULT 'N',
  4. `Rodzaj` enum('S','KH','KBH','PH','KK') NOT NULL DEFAULT 'S',
  5. `Kwota` double(10,2) NOT NULL DEFAULT '0.00',
  6. `Waluta` enum('PLN','EUR','CHF') NOT NULL DEFAULT 'PLN',
  7. `KtoWpisal` int(11) UNSIGNED NOT NULL DEFAULT '0',
  8. `DataWpisania` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  9. PRIMARY KEY (`IDTransakcji`),
  10. KEY `IDTransakcji` (`IDTransakcji`),
  11. KEY `KtoWpisal` (`KtoWpisal`),
  12. KEY `Status` (`Status`)
  13. ) TYPE=MyISAM;
  14.  
  15. INSERT INTO `Transakcje` VALUES (1511,'E','S',2153.44,'PLN',1, '2004-10-06
  16. 16:25:16');
  17.  
  18. CREATE TABLE `Uzytkownicy` (
  19. `IDUzyt` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  20. `ImieINazwisko` varchar(60) NOT NULL DEFAULT '',
  21. `IDOddzialu` int(11) UNSIGNED NOT NULL DEFAULT '0',
  22. PRIMARY KEY (`IDUzyt`),
  23. KEY `IDOddzialu` (`IDOddzialu`)
  24. ) TYPE=MyISAM;
  25.  
  26. INSERT INTO `` VALUES (1, 'Janko Walski', 20);
  27.  
  28. CREATE TABLE `Oddzialy` (
  29. `IDOddzialu` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  30. `Nip` varchar(13) NOT NULL DEFAULT '',
  31. `Nazwa` varchar(60) NOT NULL DEFAULT '',
  32. PRIMARY KEY (`IDOddzialu`),
  33. KEY `IDOddzialu` (`IDOddzialu`),
  34. KEY `Nip` (`Nip`)
  35. ) TYPE=MyISAM;
  36.  
  37. INSERT INTO `Oddzialy` VALUES (1, '123-456-78-90, 'Oddział Pierwszy z Brzegu');


Będę wdzięczny za pomoc w rozwiązaniu problemu, "pałuję" się już z nim dłuższy czas i nie mam pomysłu co dalej.

Dziękuję i pozdrawiam,
Krzysiek
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: 10.10.2025 - 14:59