Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pomoc w optymalizacji zapytania
wojtaas_pl
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.07.2013

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


Witam.

Mam taką tabele:

  1. +--+-------+------------------+---------------------+
  2. |id|ip |referer |time |
  3. +--+-------+------------------+---------------------+
  4. |1 |1.2.3.4 |http://google.pl/ |1970-01-01 00:00:00|
  5. +--+-------+------------------+---------------------+
  6. |2 |3.2.1.2 |http://bing.com/ |1971-02-01 00:10:00|
  7. +--+-------+------------------+---------------------+
  8. itd.


ogólnie jakieś tam statystyki z zapisem z jakiego IP jaki referer i kiedy.
Potrzebuję wyświetlić 20 ostatnich unikalnych (tak aby w wyniku nie powtarzały się adresy) wejść, plus dodać falagę ze w referer zawiera słowo %msg%.

Mam taki kod, który działa ale przy ok 10tyś. rekordów już zamula. Czy można go zoptymalizować:

  1. SELECT id, ip AS wyip, ile, referer, time, (
  2.  
  3. CASE WHEN (
  4. (
  5.  
  6. SELECT COUNT( ip )
  7. FROM `stats`
  8. WHERE wyip = ip
  9. AND referer LIKE '%msg%'
  10. ) >0
  11. )
  12. THEN '1'
  13. ELSE '0'
  14. END
  15. ) AS msg
  16. FROM (
  17.  
  18. SELECT IP AS UNIQIP, COUNT( IP ) AS ILE
  19. FROM `stats`
  20. GROUP BY IP
  21. )T2, (
  22.  
  23. SELECT id, time, ip, referer
  24. FROM (
  25.  
  26. SELECT MAX( time ) AS time, MAX( id ) AS id, ip, referer
  27. FROM `stats`
  28. GROUP BY ip
  29. ORDER BY id DESC
  30. ) AS `stats`
  31. LEFT JOIN `stats`
  32. USING ( id, time, ip, referer)
  33. )T
  34. WHERE IP = UNIQIP
  35. ORDER BY ID DESC
  36. LIMIT 0 , 20
  37.  
  38.  


Dziękuje za odpowiedzi:)
Go to the top of the page
+Quote Post
buliq
post
Post #2





Grupa: Zarejestrowani
Postów: 559
Pomógł: 93
Dołączył: 4.03.2008
Skąd: Olsztyn

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


EXPLAIN - mysql
za dużo podzapytań chyba co?
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #3





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Czy mi się wydaje, czy to zapytanie zwraca to samo:
  1. SELECT IP, referer, AS UNIQIP, COUNT(IP) AS ILE, MAX(time) AS time, MAX(id) AS id, sign(count(case when wyip=ip AND referer LIKE '%msg%' then ip end)) FROM `stats` GROUP BY IP, referer
Go to the top of the page
+Quote Post
wojtaas_pl
post
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.07.2013

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


poniżej zamieszczam EXPLAIN ale musze przyznać że jestem zielony z tego:

  1. id select_type TABLE type possible_keys KEY key_len ref rows Extra
  2. 1 PRIMARY <derived4> ALL NULL NULL NULL NULL 4330 USING TEMPORARY; USING filesort
  3. 1 PRIMARY <derived3> ALL NULL NULL NULL NULL 4330 USING WHERE; USING JOIN buffer
  4. 4 DERIVED <derived5> ALL NULL NULL NULL NULL 4330
  5. 4 DERIVED stats eq_ref PRIMARY,id PRIMARY 4 stats.id 1
  6. 5 DERIVED stats ALL NULL NULL NULL NULL 10401 USING TEMPORARY; USING filesort
  7. 3 DERIVED stats ALL NULL NULL NULL NULL 10401 USING TEMPORARY; USING filesort
  8. 2 DEPENDENT SUBQUERY stats ALL NULL NULL NULL NULL 10401 USING WHERE
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


masakra (IMG:style_emoticons/default/biggrin.gif)
przeczytaj przykładowy rozdział http://helion.pl/ksiazki/wysoko-wydajne-my...q.htm#szczegoly

Go to the top of the page
+Quote Post

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: 20.12.2025 - 20:35