Autor | Zpráva | ||
---|---|---|---|
Lukáš66666 Profil |
#1 · Zasláno: 28. 4. 2016, 22:08:29
Zdravím, chtěl bych se zeptat jak by se dala optimalizovat funkce pro zjištění zda je článek označený jako oblíbený.
Mám tabulku oblibene v MySQL, kde jsou sloupce id, id_uzivatele, id_clanku .
Potřeboval bych vyřešit v php funkci, která mi zjistí zda se v té tabulce nachází záznam s tím id pro přihlášeného uživatele, aktuálně tam mám něco takového. function oblibeny_clanek($uzivatel,$clanek){ $result = mysql_query("SELECT id FROM oblibene WHERE id_uzivatele='$uzivatel' && id_clanku='$clanek' LIMIT 1"); if( mysql_num_rows($result)==1 ){ return true; }else{ return false; } } |
||
Dan Charousek Profil |
#2 · Zasláno: 28. 4. 2016, 22:11:07
A v čem je problém? Kromě toho, že používáš mysql a neošetřuješ si vstupy?
|
||
Lukáš66666 Profil |
#3 · Zasláno: 28. 4. 2016, 22:18:34
Dan Charousek:
Toto je jenom příklad používám mysqli a vstupy ošetřené mám, ale princip je stejný. Chci to zjednodušit. |
||
Dan Charousek Profil |
#4 · Zasláno: 28. 4. 2016, 22:28:42
Lukáš66666:
Za předpokladu, že používáš mysqli objektově: function isFavourite($article_id, $user_id, $conn) { $q = $conn->query("SELECT SUM(id) AS pocet FROM oblibene WHERE id_uzivatele = " . (int)$user_id . " AND id_clanku = " . (int)$article_id)->fetch_object(); return $q->pocet > 0; } // použití $conn = new Mysqli(/* údaje */); if(isFavourite(1, 1, $conn)) { echo 'Uživatel s ID 1 má článek s ID 1 označený jako oblíbený.'; } else { echo 'Nemá...'; } Netestoval jsem, píšu z hlavy, takže tam můžou být nějaké překlepy. |
||
Lukáš66666 Profil |
#5 · Zasláno: 28. 4. 2016, 22:46:49
Dan Charousek:
Díky. Objektově to sice nepoužívám, ale něco podobného jsem zkoušel, tak to zkusím ještě znovu. Jde mi o to, že v logu pomalých dotazů se právě tento vyskutuje nejčastěji a zdá se že to způsobuje zahlcení VPS. Na web přijde více návštěvníků vzroste zatížení cpu a spadne celý web a v tom logu pak vidím všude právě dotazy na tu tabulku oblibene. |
||
Davex Profil |
#6 · Zasláno: 28. 4. 2016, 22:58:59
Lukáš66666:
„v logu pomalých dotazů se právě tento vyskutuje nejčastěji“ Jak vypadá struktura tabulky, jaké jsou indexy a jaký je EXPLAIN dotazu?
|
||
Lukáš66666 Profil |
#7 · Zasláno: 28. 4. 2016, 23:06:29
Davex:
Struktura je primitivní. id (int) (PRIMARY) id_uzivatele (int) id_clanku (int) |
||
Keeehi Profil |
#8 · Zasláno: 29. 4. 2016, 01:02:48
Pokud na jedné stránce zjišťuješ oblíbenost více článků, nabízí se poslat jen jeden dotaz na všechny oblíbené články a pak už si jen porovnávat idčko s obdrženými.
|
||
Časová prodleva: 3 dny
|
|||
Davex Profil |
Lukáš66666:
„Struktura je primitivní.“ Bezva a dál? To se těžko radí, když poskytuješ málo informací. Mám to chápat tak, že tam není žádný index na sloupci, podle kterého se filtruje? Kolik má ta tabulka řádků? Kdyby jich bylo hodně moc, tak bych se nedivil, že by to bylo pomalé, když by se při každém dotazu musely projít skoro všechny řádky tabulky. (K tomu směřovala druhá a třetí část mé předchozí otázky.) |
||
CZechBoY Profil |
#10 · Zasláno: 1. 5. 2016, 15:40:15
U tehle spojovacich tabulek se davaj jen dva sloupce a pres oba primarni klic. Pak jeste jednoduchy index na druhy sloupec (pokud treba hledas jen podle clanku).
|
||
Lukáš66666 Profil |
#11 · Zasláno: 2. 5. 2016, 13:24:44
CZechBoY:
No ale když tu tabulku upravím na tyto dva sloupce id_uzivatele, id_clanku a chci na obou primární klíč tak mi to skončí chybovou zprávou Multiple primary key defined . To ale bude tím, že například uživatel s id 100 má v tom sloupci třeba 20 záznamů.
100, 233 100, 105 100, 34 ..... |
||
_es Profil |
#12 · Zasláno: 2. 5. 2016, 14:02:01
Lukáš66666:
„a chci na obou primární klíč“ Nie dva primárne kľúče - na každý stĺpec jeden - to logicky nejde, ale jeden primárny kľúč na dvojicu stĺpcov. |
||
Lukáš66666 Profil |
#13 · Zasláno: 2. 5. 2016, 14:07:38
_es:
To jde? V tom se nějak nevyznám. |
||
_es Profil |
#14 · Zasláno: 2. 5. 2016, 14:14:18
Lukáš66666:
„To jde?“ Áno, ide, potom je riadok tabuľky určený obidvomi stĺpcami a hodnoty tej dvojice musia byť pre každý riadok jedinečné. |
||
Lukáš66666 Profil |
_es:
Tak já to zkusím. _es: Tak toto nechapu: Duplicate entry '468-271' for key 'PRIMARY' Ten záznam tam je jenom jednou. Schválně jsem to kontroloval. |
||
Kajman Profil |
#16 · Zasláno: 2. 5. 2016, 15:09:41
Lukáš66666:
> Ten záznam tam je jenom jednou. > Schválně jsem to kontroloval. Limit 1 jste nezapomněl při kontrole odstranit? |
||
Lukáš66666 Profil |
#17 · Zasláno: 2. 5. 2016, 15:28:05
Kajman:
Kontroloval jsem to přes Adminer a když jsem zadat ty dvě hodnoty tak to vyhodilo jenom jeden záznam.
|
||
Časová prodleva: 7 let
|
0