Autor Zpráva
it47
Profil
Ahojte,

mam tabulku vyhladavanie_top (retazec, pocet) kde su uvedene najvyhladavanejsie frazy, napr.:

retazec1 456
retazec2 558
retazec3 782

teraz mam dalsiu tabulku vyhladavanie (retazec), kde su uvedene posledne vyhladavania, napr:

retazec4
retazec5
retazec2
retazec6

Chcem sa opytat, ako co najefektivnejsie a najrychlejsie spravit, ze tabulku vyhladavanie_top aktualizujem o vyrazy z tabulky vyhlavanie, t.j. ked sa uz retazec nachadza v tabulke vyhladavanie_top, tak iba zvysi pocet, a ked neexistuje, tak vytvori novy zaznam s poctom 1. Ide o to, ze v tabulke vyhladavanie moze byt aj niekolko milionov riadkov.

Vopred dakujem velmi pekne.

it47
Kajman
Profil
Sloupec retazec v tabulce vyhladavanie_top je primárním klíčem?

Zkusil bych udělat statistiku tabulky vyhladavanie...

select retazec, count(*) pridat from vyhladavanie group by retazec

A tu přičíst či založit do top tabulky. Konkrétní řešení závisí na použité databázi, někdy je možný insert i update v jednom dotaze, někdy to musí být dotazy dva.
it47
Profil
Kajman:
Sloupec retazec v tabulce vyhladavanie_top je primárním klíčem?
Ano, je to primarny unikatny kluc.

SELECT retazec, count(*) as pocet FROM `vyhladavanie` GROUP BY retazec ORDER BY pocet desc

Ano, presne toto mam vytvorene. Otazka je ci to mam teraz dotaz po dotaze kontrolovat s tabulkou vyhladavanie_top?

Lebo pokial to bude miliony dotazov, a robit milion update/insert, tak mi to pride strasne pomale, ci nie?

Otazka je, ci nedokazem spravit jeden SELECT, ktory vykona horeuvedeny select a sucasne sa spocita s udajmi v tabulke vyhladavanie top.

Co myslite?

Vopred dakujem velmi pekne.

it47
Kajman
Profil
Četl jste poslední odstavec z [#2]?
it47
Profil
Kajman:
Ano, technologia je MySQL.

Dobre, a viete mi prosim poradit ako by sa to dalo precitat z dvoch tabuliek naraz? ;-)

Vopred dakujem velmi pekne.
Keeehi
Profil
Myslím, že by to mohlo být takto.
INSERT INTO `vyhladavanie_top` (`retazec`, `pocet`) 
SELECT `retazec`, count(*) AS `pocet` FROM `vyhladavanie` GROUP BY `retazec`
ON DUPLICATE KEY UPDATE `pocet` = `pocet` + VALUES(`pocet`);
Možná bude potřeba ten select obalit ještě jedním selectem, jelikož obsahuj group by a možná také bude potřeba přejmenovat sloupce aby neměly stejná jména. Zmiňuje se o tom manuál ale úplně jasné mi to není. Bude třeba to prostě vyzkoušet.

Jinak tu tabulku vyhladavanie_top máš proč? Spouštět pokaždé dotaz SELECT retazec, count(*) AS pocet FROM vyhladavanie GROUP BY retazec ORDER BY pocet DESC je už moc náročné?
Být to tak samozřejmě může ale také nemusí. Tak jde o to, zda to máš změřené a nejde o nějakou předčasnou optimalizaci.
it47
Profil
Super, vdaka za ukazku skriptu, myslim, ze to splna nase riesenie. :)

Keeehi:
Být to tak samozřejmě může ale také nemusí. Tak jde o to, zda to máš změřené a nejde o nějakou předčasnou optimalizaci.
Ano, je to potrebne, nakolko tabulka vyhladavanie ma miliony riadkov. A teraz som vzdy tabulku vytvaral odznova a to uz tiez trvalo niekolko minut.
Preto to chcem teraz optimalizovat tak, ze bude do tabulky vyhladavanie_top spracovavat tie riadky, ktore este neboli spracovane.

Otazka je este, neda sa spravit jeden SELECT ktory spravit tento dotaz:
SELECT retazec, count(*) as pocet FROM `vyhladavanie` GROUP BY retazec ORDER BY pocet desc
a sucasne ho scita s polozkami v tabulke vyhladavanie_top.

Myslite, ze sa to neda spravit?

Vopred dakujem velmi pekne.

it47
Kajman
Profil
SELECT retazec,
       Sum(pocet) pocet
FROM   (SELECT retazec,
               Count(*) AS pocet
        FROM   `vyhladavanie`
        GROUP  BY retazec
        UNION ALL
        SELECT retazec,
               pocet
        FROM   `vyhladavanie_top`) t
GROUP BY retazec        
ORDER  BY 2 DESC  
it47
Profil
Kajman:
SELECT retazec,
       Sum(pocet) pocet
FROM   (SELECT retazec,
               Count(*) AS pocet
        FROM   `vyhladavanie`
        GROUP  BY retazec
        UNION ALL
        SELECT retazec,
               pocet
        FROM   `vyhladavanie_top`) t
ORDER  BY 2 DESC  

Dakujem pekne za MYSQL dotaz. ;-))

Neviem zistit preco, ale nefunguje to spravne. Vypise to vzdy iba jeden riadok a pocet vrati 51 (spoji vyskyt 5 a 1).

Kde moze byt prosim chyba?

Vopred dakujem velmi pekne.

it47
Kajman
Profil
Doplnil jsem chybějící řádek do [#8].
it47
Profil
Kajman:
skvele, si uplne borec, dakujem velmi pekne. Funguje to ako ma. ;-))

Velmi ste mi pomohli, pani.

Dakujem pekne.

it47
Keeehi
Profil
it47:
Ještě jedna věc, ty řádky z tabulky vyhladavanie je potřeba smazat před dalším přepočítáím. Takže bude asi potřeba přidat tam ID sloupec, zapamatovat si aktuální nejvyšší ID, přepočítat tu druhou tabulku (v tom selectu přidat omezení na maximální ID) a pak smazat všechny záznamy s ID <= tomu zapamatovanému. Jde totiž o to, že mezi tím co bude probíhat to přepočítání, tak mohou v tabulce přibýt nová data a kdyby se mazala celá tabulka, tak se o ně přijde.
Případně se dá využít dočasné kopie tabulky. Ovšem IDčka tam být musí také.

No a druhá možnost vykašlat se na tabulku vyhladavanie a používat jen vyhladavanie_top. Pri každém dotazu spustíš
INSERT INTO `vyhladavanie_top` (`retazec`, `pocet`) 
VALUES('vyhledávaný výraz', 1)
ON DUPLICATE KEY UPDATE `pocet` = `pocet` + 1;
A máš to bez složitého přepočítávání a hlavně vždy aktuální.
it47
Profil
Keeehi:
dakujem za doplnenie, urcite to tak implementujem. ;-))

este raz velka vdaka.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0