Autor Zpráva
timoti
Profil *
Dobry den,
mam nasledujuci dotaz na databazu (pouzivam Codeigniter db class)
        $query = $this->db->select("a.title AS articles_title, 
                    a.content AS articles_content,
                    a.excerpt AS articles_excerpt,
                    a.slug AS articles_slug,
                    a.views AS articles_views,
                    a.views AS articles_views,
                    CONCAT(up.first_name, ' ', up.last_name) AS articles_author,
                    DATE_FORMAT(a.created, '%T %d.%m.%Y') AS articles_created, 
                    (SELECT IF(ROUND(AVG(av.vote),1), ROUND(AVG(av.vote),1), 0)  FROM articles_votes av WHERE a.id = av.article_id) AS articles_votes,
                    (SELECT COUNT(ac.id) FROM articles_comments ac WHERE a.id = ac.article_id) AS articles_totalcomments", FALSE)
            ->from('articles a')
            ->join('user_profiles up', 'a.author_id = up.user_id')
            ->where('page_id', $page_id)
            ->order_by("a.$ordering")
            ->get();

Je dobry vzhladom na rychlost a zdroje serveru? Alebo mam vytvorit pomocne funkcie, ktore spocitaju komentare a hlasy a nasledne ich pridaju do daneho arrayu?
Dakujem za odpoved
Kajman
Profil
timoti:
Je dobry vzhladom na rychlost a zdroje serveru?

To zjistíte jeho rychlostí a prohlédnutím explainu sestaveného dotazu (nad daty v očekávaném rozsahu).
timoti
Profil *
ale v priemere to bude rychlejsie ako by som to rozdelil na viac dotazov a pouzil dvakrat php funkciu foreach na pridanie dat do vystupneho arrayu?


Prosim Vas mohli by ste mi navrhnut ake indexe vytvorit v tychto troch tabulkach?
Majkl578
Profil
Na první pohled tam vidím dva subselecty, oba závisející hodnotou na nadřezeném (ve WHERE podmínce). S tímhle bývá na MySQL docela problém (v explainu dotazu DEPENDENT SUBQUERY) a je lepší se tomu vyvarovat, jinak to může znamenat seriózní zpomalení aplikace ve chvíli, kdy tabulky mají větší počet záznamů (řádově několik tisíc a více). I řešení N+1 dotazů může být ve výsledku znatelně rychlejší.
timoti
Profil *
Majkl578:
No hej, ale aj ked sa to spoji s casom potrebnym na vykonanie 2 foreach funkcii (pri tych tisic zaznamoch)?
Kajman
Profil
timoti:
to bude rychlejsie?

To si musíte změřit sám.

ake indexe vytvorit?

Na všech sloupcích použitých ve where a joinech.

Majkl578:

Pokud je omezení díky where či limitu radikální, může být varianta s poddotazy v select části rychlejší. Spíše zlobívá použití korelovaného poddotazu ve where části.
timoti
Profil *
vyslo mi executing time 0.0046 pri jednej poziadavke..ako spravit test na napr 10000 ? Diky
pcmanik
Profil
timoti:
Použi EXPLAIN, ktorý ti už bol poradený. Tým jednoducho zistíš čo a ako sa vykonáva a podľa toho môžeš optimalizovať.
Kcko
Profil
timoti:
ako spravit test na napr 10000 ? Diky

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark
timoti
Profil *
pcmanik:
Použi EXPLAIN
select_type    PRIMARY
table    a
type    ref
possible_keys    page_id,page_id_2,author_id
key    page_id
key_len    5
ref    const
rows    2
Extra    Using where; Using temporary; Using filesort


select_type    PRIMARY
table    up
type    ALL
possible_keys    PRIMARY
rows    2
Extra    Using where; Using join buffer


select_type    DEPENDENT SUBQUERY
table    ac
type    system
possible_keys    article_id
rows    1
select_type    DEPENDENT SUBQUERY
table    av
type    ref
possible_keys    article_id
key    article_id
key_len    5
ref    databaza.a.id
rows    2
Extra    Using where



Kcko:
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark

vzdy mi to pise chybu #1241 - Operand should contain 1 column(s) ...
toto je moj dotaz:


SELECT BENCHMARK( 100, (

SELECT a.title AS articles_title, a.content AS articles_content, a.excerpt AS articles_excerpt, a.slug AS articles_slug, a.views AS articles_views, a.views AS articles_views, CONCAT(up.first_name, ' ', up.last_name) AS articles_author, DATE_FORMAT(a.created, '%T %d.%m.%Y') AS articles_created, (SELECT IFNULL(ROUND(AVG(av.vote), 1), 0) FROM articles_votes av WHERE a.id = av.article_id) AS articles_votes, (SELECT COUNT(ac.id) FROM articles_comments ac 
 WHERE a.id = ac.article_id) AS articles_totalcomments
FROM (`articles` a)
JOIN `user_profiles` up ON `a`.`author_id` = `up`.`user_id`
WHERE `id` =  1
ORDER BY `a`.`created`

) )
ako ho uprait aby to chybu nepisalo?
Kajman
Profil
timoti:
ako spravit test na napr 10000 ?

Nestačí Vám vynásobit ten čas tímto číslem?

V explainu to nevypadá na nějakou větší botu.

Máte pocit, že ten dotaz je řádově pomalejší než jiné, které tam používáte, nebo se snažíte optimalovat i tam, kde není třeba?
timoti
Profil *
Tak chcel by som co najlepsiu optimalizaciu... Ako sa moze zbavit tohto? Extra Using where; Using temporary; Using filesort Je to tam stale aj ked som urobil index v tabulke articles a pre (id, created)...kde je problem?

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