Autor | Zpráva | ||
---|---|---|---|
it47 Profil |
#1 · Zasláno: 6. 12. 2018, 23:03:50
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 |
#2 · Zasláno: 6. 12. 2018, 23:20:35
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 |
#3 · Zasláno: 6. 12. 2018, 23:32:30
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 |
#4 · Zasláno: 6. 12. 2018, 23:51:02
Četl jste poslední odstavec z [#2]?
|
||
it47 Profil |
#5 · Zasláno: 6. 12. 2018, 23:58:48
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`); 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 |
#7 · Zasláno: 7. 12. 2018, 13:09:29
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 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 |
#9 · Zasláno: 7. 12. 2018, 14:11:58
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 |
#10 · Zasláno: 7. 12. 2018, 14:25:08
Doplnil jsem chybějící řádek do [#8].
|
||
it47 Profil |
#11 · Zasláno: 7. 12. 2018, 16:13:13
Kajman:
skvele, si uplne borec, dakujem velmi pekne. Funguje to ako ma. ;-)) Velmi ste mi pomohli, pani. Dakujem pekne. it47 |
||
Keeehi Profil |
#12 · Zasláno: 7. 12. 2018, 18:38:22
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; |
||
it47 Profil |
#13 · Zasláno: 8. 12. 2018, 17:50:28
Keeehi:
dakujem za doplnenie, urcite to tak implementujem. ;-)) este raz velka vdaka. |
||
Časová prodleva: 5 let
|
0