Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: wydajność zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
acztery
witam mam takie zapytanie:

  1. SELECT * ,
  2. (SELECT count(*) FROM stat WHERE stat.D='1' AND DocId=www.Id ) AS a1,
  3. (SELECT count(*) FROM stat WHERE stat.D='2' AND DocId=www.Id ) AS a2,
  4. (SELECT count(*) FROM stat WHERE stat.D='3' AND DocId=www.Id ) AS a3,
  5. (SELECT count(*) FROM stat WHERE stat.D='4' AND DocId=www.Id ) AS a4,
  6. (SELECT count(*) FROM stat WHERE stat.D='5' AND DocId=www.Id ) AS a5,
  7. (SELECT count(*) FROM stat WHERE stat.D='6' AND DocId=www.Id ) AS a6,
  8. (SELECT count(*) FROM stat WHERE stat.D='7' AND DocId=www.Id ) AS a7,
  9. (SELECT count(*) FROM stat WHERE stat.D='8' AND DocId=www.Id ) AS a8,
  10. (SELECT count(*) FROM stat WHERE stat.D='9' AND DocId=www.Id ) AS a9,
  11. (SELECT count(*) FROM stat WHERE stat.D='10' AND DocId=www.Id ) AS a10,
  12. (SELECT count(*) FROM stat WHERE stat.D='11' AND DocId=www.Id ) AS a11,
  13. (SELECT count(*) FROM stat WHERE stat.D='12' AND DocId=www.Id ) AS a12,
  14. (SELECT count(*) FROM stat WHERE stat.D='13' AND DocId=www.Id ) AS a13,
  15. (SELECT count(*) FROM stat WHERE stat.D='14' AND DocId=www.Id ) AS a14,
  16. (SELECT count(*) FROM stat WHERE stat.D='15' AND DocId=www.Id ) AS a15,
  17. (SELECT count(*) FROM stat WHERE stat.D='16' AND DocId=www.Id ) AS a16,
  18. (SELECT count(*) FROM stat WHERE stat.D='17' AND DocId=www.Id ) AS a17,
  19. (SELECT count(*) FROM stat WHERE stat.D='18' AND DocId=www.Id ) AS a18,
  20. (SELECT count(*) FROM stat WHERE stat.D='19' AND DocId=www.Id ) AS a19,
  21. (SELECT count(*) FROM stat WHERE stat.D='20' AND DocId=www.Id ) AS a20,
  22. (SELECT count(*) FROM stat WHERE stat.D='21' AND DocId=www.Id ) AS a21,
  23. (SELECT count(*) FROM stat WHERE stat.D='22' AND DocId=www.Id ) AS a22,
  24. (SELECT count(*) FROM stat WHERE stat.D='23' AND DocId=www.Id ) AS a23,
  25. (SELECT count(*) FROM stat WHERE stat.D='24' AND DocId=www.Id ) AS a24,
  26. (SELECT count(*) FROM stat WHERE stat.D='25' AND DocId=www.Id ) AS a25,
  27. (SELECT count(*) FROM stat WHERE stat.D='26' AND DocId=www.Id ) AS a26,
  28. (SELECT count(*) FROM stat WHERE stat.D='27' AND DocId=www.Id ) AS a27,
  29. (SELECT count(*) FROM stat WHERE stat.D='28' AND DocId=www.Id ) AS a28,
  30. (SELECT count(*) FROM stat WHERE stat.D='29' AND DocId=www.Id ) AS a29,
  31. (SELECT count(*) FROM stat WHERE stat.D='30' AND DocId=www.Id ) AS a30,
  32. (SELECT count(*) FROM stat WHERE stat.D='31' AND DocId=www.Id ) AS a31
  33.  
  34. FROM www GROUP BY www.Id


Ale przy np 40 tys rekordów w bazu stat mam komunikat o braku pamięci. Jak wywołam zapytanie bezpośrednio w phpmyadminie jest. może ktoś ma jakiś pomysł. Indexy są
melkorm
eh pokaż z jakich tabel (najlepie ich struktury) co chcesz uzyskać ;] (najlepiej na przykładzie)
acztery
mam 2 tabele

1 to www gdzie są strony www
2 to stat gdzie sa statystyki

pole D to dzień miesiąca

i teraz chce wyswetlic liste wszystkich stron i policzyc ile bylo odwiedzin dla kazdej strony ( a1,a2, i tak analogicznie )

struktura

Kod
CREATE TABLE `stat` (
  `Id` int(10) NOT NULL auto_increment,
  `DocId` int(10) NOT NULL,
  `Act` enum('N','Y') collate utf8_unicode_ci NOT NULL,
  `UserId` int(6) NOT NULL,
  `Typ` enum('A','S') collate utf8_unicode_ci NOT NULL,
  `Ip` varchar(30) collate utf8_unicode_ci NOT NULL,
  `Red` varchar(200) collate utf8_unicode_ci NOT NULL,
  `Date` varchar(200) collate utf8_unicode_ci NOT NULL,
  `Time` int(15) NOT NULL,
  `M` int(2) NOT NULL,
  `W` int(2) NOT NULL,
  `D` int(2) NOT NULL,
  PRIMARY KEY  (`Id`),
  KEY `D` (`D`),
  KEY `Typ` (`Typ`),
  KEY `DocId` (`DocId`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=13002;

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `www`
--

CREATE TABLE `www` (
  `Id` int(10) NOT NULL auto_increment,
  `CatId` int(10) NOT NULL,
  `UserId` int(10) NOT NULL,
  `Date` varchar(180) NOT NULL,
  `Act` enum('N','Y') NOT NULL,
  `Adult` enum('N','Y') NOT NULL,
  `Title` varchar(250) character set utf8 collate utf8_polish_ci NOT NULL,
  `Desc` text character set utf8 collate utf8_polish_ci NOT NULL,
  `http` varchar(250) character set ucs2 collate ucs2_polish_ci NOT NULL,
  `Typ` enum('W','Z','N') NOT NULL,
  `Img1` varchar(200) NOT NULL,
  PRIMARY KEY  (`Id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34;
phpion
To co pokazałeś w pierwszym poście to jakiś koszmar! Nie sądziłem, że ktoś jest w stanie trzaskać (wymyśleć!) takie zapytanie... Ja bym Ci sugerował inne podejście do sprawy oraz zapoznanie się z tematyką:
- grupowanie (GROUP BY),
- podzapytania skorelowane.
Wykorzystując grupowanie jesteś w stanie bez problemu otrzymać statystyki, o które Ci chodzi. Jest tu jednak jeden problem: jeżeli w tabeli 'stat' nie będzie żadnych odwiedzin dla któregoś dokumentu to nie zostanie on uwzględniony w zbiorze wynikowym.
Wykorzystując podzapytanie skorelowane ominiesz powyższą niedogodność ale samo zapytanie może być mniej wydajne (szczególnie przy większej ilości dokumentów).
Decyzja, którą drogą pójdziesz należy do Ciebie.
ddiceman
Jezeli chcesz uzyskac taki format, jaki miales, to proponuje

  1. SELECT *,
  2. SUM(IF(stat.D = '1', 1, 0)) AS a1,
  3. SUM(IF(stat.D = '2', 1, 0)) AS a2,
  4. SUM(IF(stat.D = '3', 1, 0)) AS a3,
  5. ...
  6. SUM(IF(stat.D = '31', 1, 0)) AS a31
  7. FROM www LEFT JOIN stat ON (www.Id = stat.DocId)
  8. GROUP BY www.Id;


Jezeli mozesz troche zmienic

  1. SELECT *, COUNT(stat.DocId) FROM www LEFT JOIN stat ON (www.Id = stat.DocId) GROUP BY www.Id, stat.DocId;


Ale pisze z palca, wiec musisz sam przetestowac sobie to.
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.