Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

hej.

mam taki kawałek kody kóry pobiera listę tagów i zlicza ilosc tagów danej kolumnie sumuje i update ale tego juz jest kilka tys i pada.

moze ktoś umie to poskladać w 1 zapytanie SQL, powinno byc szybciej

$result=mysql_query( "SELECT * FROM tag ORDER BY `id` ASC ", $link );

$aRow = mysql_fetch_array($result);

while ( $aRow = mysql_fetch_array( $result ) )
{

// liczymy art
$result2=mysql_query( "SELECT Count(id) as ile FROM documents WHERE Tag LIKE '%".$aRow['Tag']."%'", $link );
$aRow2 = mysql_fetch_array($result2);

// liczymy porady
$result3=mysql_query( "SELECT Count(id) as ile FROM board WHERE Tag LIKE '%".$aRow['Tag']."%'", $link );
$aRow3 = mysql_fetch_array($result3);
// liczymy testy
$result4=mysql_query( "SELECT Count(id) as ile FROM base WHERE Tag LIKE '%".$aRow['Tag']."%'", $link );
$aRow4 = mysql_fetch_array($result4);

$licz_war = $aRow2['ile'] +$aRow3['ile']+$aRow4['ile'];

mysql_query("UPDATE tag SET Count = '".$licz_war."' WHERE Id = '".$aRow['Id']."';", $link );
}
Janusz Skudrzyk

Janusz Skudrzyk Członek zarządu,
weblabs.pl

Temat: zapytanie SQL które generuje duży ruch

a może by tak:
select tag from documents/board/base
w petli: $tablica[$tag]++
na koniec: foreach( $tablica as $tag => $liczba ) update UPDATE tag SET Count = '$liczba' WHERE tag = '$tag'

a właściwie dobrze by było naliczać tagi przy dodawaniu wpisów do w.w. tabel

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

a może wszystko za pomocą jednego update z podzapytaniem?

ludzie od takich spraw jest SQL!!
Piotr Maliński

Piotr Maliński Programista
Python/Django

Temat: zapytanie SQL które generuje duży ruch

LIKE wydajne nie jest i nie będzie. Podzapytania też raczej fajne nie są. Rozwiązanie to keszowanie wyników, bądź też denormalizacja danych - zapisywanie w bazie gotowych wyliczeń i aktualizowaniu ich przy zapytaniach zapisujących.
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

radek pokaz mi te zapytanie mam takie cos, tylko dla testu

SELECT * , (

SELECT Count( id ) AS ile
FROM documents
WHERE Tag LIKE `%TU TAG%`
) AS c1

FROM tag
ORDER BY `id` ASC

to tylko test czy sie w ogole uda ale nie wiem jak przekazać odp tag do TU TAG?? tag.Tag :/

wynikiem zapytania byla by lista tagów a w kolumnie c1 byly by odp wartosci wystopien dla danego tagu w tabeli documents.Piotr Stanek edytował(a) ten post dnia 09.03.09 o godzinie 16:54
Stanisław P.

Stanisław P. Software designer

Temat: zapytanie SQL które generuje duży ruch

Zamiast wyszukiwania zliczanie, jak powiedział Janusz.
Albo pomyśleć jeszcze raz nad tagami:

$result2=mysql_query( "SELECT Count(id) as ile FROM documents WHERE Tag LIKE '%".$aRow['Tag']."%'", $link );

Masz tagi w formie "tag1 tag2 tag3" w tym polu?
Jeśli nie, to może "Tag == ..." zamiast LIKE.
Jeśli tak, to masz problem ze zliczaniem. "tag1" złapie się do zliczenia w ramach tagów "t" "a" "g" "ta" "ag" "g1" ...
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

interesuje mnie tylko 1 zapytanie tam mam np tag1,tag2,tag3 w 1 kolumnie (nie jest to idealne) ale zapoźnio do tego doszłem...:(

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

LIKE zamula Ci zapytanie, niestety.

dobra rada juz sie pojawila - dodanie kolumny dodatkowej przy kazdym tagu i tam z automatu zwiekszanie liczby przy kolejnym wystapieniu taga, dzieki czemu spokojnie zrobisz to wszystko jednym zapytaniem.
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: zapytanie SQL które generuje duży ruch

Piotr Stanek:
$result=mysql_query( "SELECT * FROM tag ORDER BY `id` ASC ",
$aRow = mysql_fetch_array($result);
tu przecież otrzymujesz zmienną: $aRow[ile]
i możesz ją śmiało wykorzystać...
$licz_war = $aRow2['ile'] +$aRow3['ile']+$aRow4['ile'];
... czyli tu bym wstawił linijkę: if($licz_war!=$aRow[ile])
mysql_query("UPDATE tag SET Count = '".$licz_war."' WHERE Id

i będziesz miał już parędziesiąt UPDATE, zamiast paru tysięcy, bo będzie updatować tylko te tagi, gdzie nastąpiła zmiana.
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

Wojtku poradziłem sobie jakoś, ale dzięki dobry pomysł, że nie zrobiłem tego wcześniej..

pozdr,

konto usunięte

Temat: zapytanie SQL które generuje duży ruch


UPDATE
tag,

(select id, sum(ILE) as e

from (

SELECT
tag.id,
COUNT(d.id) AS ILE
FROM
tag,
documents d
WHERE
d.Tag LIKE CONCAT('%', tag.tag, '%')
GROUP BY
tag.id

union all

SELECT
tag.id,
COUNT(b.id) AS ILE
FROM
tag,
base b
WHERE
b.Tag LIKE CONCAT('%', tag.tag, '%')
GROUP BY
tag.id

union all

SELECT
tag.id,
COUNT(bo.id) AS ILE
FROM
tag,
board bo
WHERE
bo.Tag LIKE CONCAT('%', tag.tag, '%')
GROUP BY
tag.id


) as source

group by id) t


jedno zapytanie SQL robi to wszystko co robiły te zapytania i PHP
Piotr Maliński

Piotr Maliński Programista
Python/Django

Temat: zapytanie SQL które generuje duży ruch

Pewnie fajowo zamula serwer ;)

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

A ja mam postulat do wszystkich programistów. Piszcie jeśli tylko macie możliwość obiektowo
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

janusz obiektowo pisac taki kawałek kodu? po co pisac klase do tego aby zrobil 1 update...

@Przemo dzięki
PS w zapytaniu jest błąd...
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 48Piotr Stanek edytował(a) ten post dnia 12.03.09 o godzinie 21:40

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

Piotr Maliński:
Pewnie fajowo zamula serwer ;)

Pewnie i bardzo, ale jesli.

- dodawanie nowego czegos tam jest operacja wykonywana rzadko.
- ta duza operacja jest wykonywana asynchronicznie

Takie zapytania moga zdac egzamin.

(nie mowie akurat o tej sytuacji, ale o ogolnie takich kobylach w pewnych warunkach)
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

Marcin raz na 2 tyg wykonuje ten kawałek kodu odpalam go z crona. dodałem tylko kilka zabezpieczeń aby nie wykonało sie SI.

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

Piotr Stanek:
Marcin raz na 2 tyg wykonuje ten kawałek kodu odpalam go z crona. dodałem tylko kilka zabezpieczeń aby nie wykonało sie SI.

No to ja nie widze problemu z uzywaniem takiej kobyly zapytania, a nawet bym je polecal.

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

Piotr Stanek:
janusz obiektowo pisac taki kawałek kodu? po co pisac klase do tego aby zrobil 1 update...

@Przemo dzięki
PS w zapytaniu jest błąd...
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 48

tu dałem kod

forum nie jest idealnym miejscem dla SQL-a, obcinane są znaki :(Przemysław R. edytował(a) ten post dnia 12.03.09 o godzinie 22:04

konto usunięte

Temat: zapytanie SQL które generuje duży ruch

a tak na marginesie
zauważyłem ogólny problem z SQL-em

czy dla większości z was podzapytania, tudzież inne bardziej skomplikowane rzeczy to jakieś voodoo?

prawdę mówiąc to ja na MySQLu się nie znam :)
Piotr Stanek

Piotr Stanek Programista PHP /
JS developer

Temat: zapytanie SQL które generuje duży ruch

Przemek ale wydaje sie, żę kod php jest wydajniejszy

mysql ok 140,5 sek
php ok 68,4 sek

Więc daruje sobie te zapytanie. Zostane przy php

EDIT

Ogólnie podzapytanie moim zdaniem to zła rzecz, jestem za JOIN LEFT itp itd ale podzapytania jakoś mi nie leżą...

W tym przypadku jezeli mam 5 tyg tagów i po 25 tyg rekordów w każdej tabeli (z tych trze) mysql nie wydoli....Piotr Stanek edytował(a) ten post dnia 12.03.09 o godzinie 22:11

Następna dyskusja:

Zapytanie SQL z sortowanie...




Wyślij zaproszenie do