Autor Zpráva
Lukáš66666
Profil
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
A v čem je problém? Kromě toho, že používáš mysql a neošetřuješ si vstupy?
Lukáš66666
Profil
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
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
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
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
Davex:
Struktura je primitivní.

id (int) (PRIMARY)
id_uzivatele (int)
id_clanku (int)
Keeehi
Profil
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.
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
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
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
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
_es:
To jde? V tom se nějak nevyznám.
_es
Profil
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
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
Kajman:
Kontroloval jsem to přes Adminer a když jsem zadat ty dvě hodnoty tak to vyhodilo jenom jeden záznam.

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: