Autor | Zpráva | ||
---|---|---|---|
timoti Profil * |
#1 · Zasláno: 23. 8. 2012, 09:45:12
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 |
#2 · Zasláno: 23. 8. 2012, 10:04:06
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 * |
#3 · Zasláno: 23. 8. 2012, 11:34:40 · Upravil/a: timoti
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 * |
#5 · Zasláno: 23. 8. 2012, 12:22:51
Majkl578:
No hej, ale aj ked sa to spoji s casom potrebnym na vykonanie 2 foreach funkcii (pri tych tisic zaznamoch)? |
||
Kajman Profil |
#6 · Zasláno: 23. 8. 2012, 12:32:09
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 * |
#7 · Zasláno: 23. 8. 2012, 14:17:43
vyslo mi executing time 0.0046 pri jednej poziadavke..ako spravit test na napr 10000 ? Diky
|
||
pcmanik Profil |
#8 · Zasláno: 23. 8. 2012, 14:27:23
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 |
#9 · Zasláno: 23. 8. 2012, 14:33:35
timoti:
„ako spravit test na napr 10000 ? Diky“ http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark |
||
timoti Profil * |
#10 · Zasláno: 23. 8. 2012, 15:08:15 · Upravil/a: timoti
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: „ht>tp://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` ) ) |
||
Kajman Profil |
#11 · Zasláno: 23. 8. 2012, 16:20:22
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 * |
#12 · Zasláno: 24. 8. 2012, 09:09:09
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?
|
||
Časová prodleva: 12 let
|
0