{"id":176,"date":"2020-10-08T15:28:13","date_gmt":"2020-10-08T13:28:13","guid":{"rendered":"https:\/\/wiki.activenet.sk\/?p=176"},"modified":"2020-10-08T15:29:44","modified_gmt":"2020-10-08T13:29:44","slug":"zaklady-ako-zrychlit-nacitavanie-webu","status":"publish","type":"post","link":"https:\/\/wiki.activenet.sk\/index.php\/2020\/10\/08\/zaklady-ako-zrychlit-nacitavanie-webu\/","title":{"rendered":"Z\u00e1klady ako zr\u00fdchli\u0165 na\u010d\u00edtavanie webu"},"content":{"rendered":"\n<p><strong>V poslednom obdob\u00ed som viac kr\u00e1t rie\u0161il probl\u00e9m s na\u010d\u00edtavan\u00edm webov\u00fdch str\u00e1nok, ktor\u00fdm sa zva\u010d\u0161il objem d\u00e1t (hlavne v datab\u00e1ze). Prvotn\u00e9 reklam\u00e1cia smerovala samozrejme na server a jeho v\u00fdkon. Po par testoch sa v\u0161ak zistilo, \u017ee v\u00fdkon je v poriadku a server sa nudi aj v pr\u00edpade, \u017ee sa str\u00e1nka na\u010d\u00edtava 3-4 sekundy.<\/strong><\/p>\n\n\n\n<p>Pozrieme sa na to, ako si na\u0161u str\u00e1nku otestova\u0165 a vyladi\u0165 aby bola r\u00fdchlos\u0165 na\u010d\u00edtavania \u010do najlep\u0161ia.<\/p>\n\n\n\n<p>T\u00e1to t\u00e9ma je ve\u013emi rozsiahla, tak som sa ju rozhodol rozdeli\u0165 do troch \u010dasti.<\/p>\n\n\n\n<ol><li><strong>\u010das\u0165<\/strong>&nbsp;\u2013 pozrieme sa ako si zmera\u0165 r\u00fdchlos\u0165 na\u010d\u00edtavania, ako n\u00e1js\u0165 probl\u00e9m a ako vyrie\u0161i\u0165 naj\u010dastej\u0161ie sa opakuj\u00face sa probl\u00e9my<\/li><li><strong>\u010das\u0165 \u2013&nbsp;<\/strong>optimaliz\u00e1cia datab\u00e1zy<\/li><li><strong>\u010das\u0165<\/strong>&nbsp;\u2013 pozrieme sa na optimaliz\u00e1ciu prostredia, ako si str\u00e1nku upravi\u0165, aby potrebovala na prev\u00e1dzku minim\u00e1lny v\u00fdkon<\/li><\/ol>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"https:\/\/www.speedweb.sk\/blog\/wp-content\/uploads\/2015\/12\/speedweb-hosting.jpg\"><img decoding=\"async\" src=\"https:\/\/www.speedweb.sk\/blog\/wp-content\/uploads\/2015\/12\/xspeedweb-hosting.jpg.pagespeed.ic.kwh5zCa1-E.webp\" alt=\"speedweb-hosting\" class=\"wp-image-263\"\/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Anal\u00fdza prev\u00e1dzky a na\u010d\u00edtavania<\/h2>\n\n\n\n<p>Sk\u00f4r, ako za\u010dneme prech\u00e1dza\u0165 samotn\u00fd k\u00f3d str\u00e1nky, je dobr\u00e9 pozrie\u0165 sa na procesy webservera a skontrolova\u0165 si, &nbsp;napr\u00edklad vo v\u00fdpise top, \u010di na\u0161a str\u00e1nka zaber\u00e1 vy\u0161\u0161\u00ed v\u00fdkon procesora. V\u00e4\u010d\u0161inou tak\u00e1to pomal\u00e1 str\u00e1nka dok\u00e1\u017ee zabra\u0165 cel\u00e9 jadro procesoru, ktor\u00e9 obsluhuje dan\u00fd proces.<\/p>\n\n\n\n<p>Ak m\u00e1me pri v\u00fdpise tom podobn\u00e9 hodnoty ako na obr\u00e1zku, je potrebn\u00e9 so za\u010dat\u00edm debugu k\u00f3du str\u00e1nky. Pr\u00edklad v\u00fdpisu top pr\u00edkazu:<a href=\"https:\/\/www.speedweb.sk\/blog\/wp-content\/uploads\/2015\/12\/top.png\"><\/a><\/p>\n\n\n\n<p id=\"caption-attachment-270\">v\u00fdpis procesov<\/p>\n\n\n\n<p>\u010eal\u0161ou ve\u013emi d\u00f4le\u017eit\u00fdm nastaven\u00edm pri anal\u00fdze webu je logovanie pomal\u00fdch query a query, ktor\u00e9 nepou\u017e\u00edvaj\u00fa indexy. Ve\u013ek\u00e1 v\u00e4\u010d\u0161ina pomal\u00fdch webov nem\u00e1 spr\u00e1vne zadefinovan\u00e9 indexy. Viac o optimaliz\u00e1ci\u00ed query a datab\u00e1z si povieme v pokra\u010dovan\u00ed m\u00f4jho \u010dl\u00e1nku.<\/p>\n\n\n\n<p>Pre debugovanie webovej str\u00e1nky si spravte rad\u0161ej kopiu webu a testujte v\u0161etky pr\u00edklady na subdom\u00e9ne. Napr\u00edklad dev.speedweb.sk<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Meranie spotrebovanej RAM<\/h2>\n\n\n\n<p>Mera\u0165 spotrebovan\u00fa je mo\u017ene r\u00f4znymi sp\u00f4sobmi. Najjednoduch\u0161ie to je pomocou nastavenia&nbsp;<strong>auto_append_file.&nbsp;<\/strong>Vytvor\u00edme si skript memory_usage.php a tento skript zadefinujeme ako auto_append_file. Toto nastavenie n\u00e1m sprav\u00ed to, \u017ee ka\u017ed\u00e1 n\u00e1v\u0161teva n\u00e1m zaloguje hodnotu spotrebovanej ram.<\/p>\n\n\n\n<p>Pr\u00edklad skriptu memory_usage.php<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em>&lt;?php<\/em><\/p><p><em>$memory = memory_get_usage();<\/em><\/p><p><em>function nice_val ($val) {<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (abs($val) &lt; 1000 * 1024) {<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return number_format($val \/ 1024, 2) . \u201c kB\u201c;<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (abs($val) &lt; 1000 * 1048576) {<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return number_format($val \/ 1048576, 2) . \u201c MB\u201c;<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/em><br><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $val;<\/em><br><em>}<\/em><\/p><p><em>$mem = nice_val($memory);<\/em><br><em>$line = \u201e{$_SERVER[\u201aSCRIPT_FILENAME\u2018]} =&gt; {$mem}\u201c;<\/em><br><em>openlog(\u201ePHP Memory usage\u201c, LOG_PID, LOG_SYSLOG);<\/em><br><em>syslog(LOG_WARNING, $line);<\/em><\/p><\/blockquote>\n\n\n\n<p>Mera\u0165 spotrebovan\u00fa ram m\u00f4\u017eeme v tomto pr\u00edpade len ak m\u00e1me pr\u00edstup k logom servera a vieme si nastavi\u0165 PHP premenn\u00fa auto_append_file. Ak tieto mo\u017enosti nem\u00e1me, m\u00f4\u017eeme si na konci na\u0161ich skriptov vlo\u017ei\u0165 k\u00f3d, ktor\u00fd n\u00e1m zap\u00ed\u0161e spotrebovan\u00fa RAM do s\u00faboru.<\/p>\n\n\n\n<p>Pr\u00edklad k\u00f3du:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><em><code>$memory = memory_get_usage();<br>$line = \"{$_SERVER['SCRIPT_FILENAME']} =&gt; {$memory}\";<br>$fp&nbsp;=&nbsp;fopen('memory.log',&nbsp;'w');<br>fwrite($fp, $line);<br>fclose($fp);<\/code><\/em><\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Meranie \u010dasu<\/h2>\n\n\n\n<p>Na meranie \u010dasu trvania skriptu je potrebn\u00e9 mera\u0165 tak, \u017ee si od\u010d\u00edtame \u010das na konci a za\u010diatku skriptu. Pou\u017eijeme na to funkciu microtime() s parametrom true.<\/p>\n\n\n\n<p>Pr\u00edklad k\u00f3du<code><em>&lt;?php<\/em><br><em>$zaciatok =&nbsp;microtime(true);<\/em><\/code><em>\/\/ V\u00e1\u0161 k\u00f3d$koniec =&nbsp;microtime(true);<\/em><br><em>$cas =&nbsp;$koniec \u2013&nbsp;$zaciatok;echo&nbsp;\u201eSkript trval $cas sekund\\n\u201c;<\/em><br><em>?&gt;<\/em>Takto m\u00f4\u017eeme mera\u0165 \u010das na\u010d\u00edtavania na r\u00f4znych miestach k\u00f3du. Zvy\u010dajne sa dopracujete k p\u00e1r problematick\u00fdm miestam, ktor\u00e9 bude potrebn\u00e9 prerobi\u0165 a optimalizova\u0165. Naj\u010dastej\u0161ie to b\u00fdva generovanie obr\u00e1zkov, pdf s\u00faborov a volanie datab\u00e1zov\u00fdch query. Problematika vytv\u00e1rania tabuliek a optimaliz\u00e1cia query je na tolko obsiahla, \u017ee som sa jej rozhodol venova\u0165 zvl\u00e1\u0161t cl\u00e1nok.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Optimaliz\u00e1cia datab\u00e1z<\/h2>\n\n\n\n<p>Naj\u010dastej\u0161ou pr\u00ed\u010dinou pomal\u00e9ho na\u010d\u00edtavania str\u00e1nok b\u00fdva optimaliz\u00e1cia datab\u00e1zy, zle navrhnut\u00e9 tabu\u013eky (\u0161trukt\u00fara, velkos\u0165, indexy), zle vyskladan\u00e9 query. Pri vytv\u00e1rani a spr\u00e1ve databazy je v\u017edy potrebne ma\u0165 na pam\u00e4ti ot\u00e1ku:&nbsp;<strong><em>Ako sa mi bude syst\u00e9m sprava\u0165, ak mi d\u00e1ta narast\u00fa na sto tis\u00edc a\u017e milion z\u00e1znamov?&nbsp;<\/em><\/strong>Aj tie najhor\u0161ie query zbehn\u00fa za v\u00fdborny \u010das, ak rob\u00edme&nbsp;<em>select<\/em>&nbsp;len cez p\u00e1r riadkov.<br><br><strong>D\u00e1tov\u00fd typ tabuliek<\/strong><\/p>\n\n\n\n<p>Naj\u010dastej\u0161ie sa pou\u017e\u00edvaj\u00fa dva typy MyIsam a InnoDB. MyIsam je r\u00fdchlej\u0161\u00ed typ, na druhej strane nie je zaru\u010den\u00e1 konzistentno\u0165 d\u00e1t. \u010eal\u0161ou nev\u00fdhodou je \u010das locknutia tabuliek pri updatoch. InnoDB je pomal\u0161\u00ed engine, na druhej strane sa n\u00e1m ale star\u00e1 o konzistentnos\u0165 d\u00e1t a v pripade chyby sa vie vr\u00e1ti\u0165. Ak ale nepotrebujete v\u00fdu\u017e\u00edva\u0165 transakcie, odpor\u00fa\u010dam pou\u017e\u00edva\u0165 typ MyIsam.<\/p>\n\n\n\n<p><strong>\u0160trukt\u00fata tabuliek<\/strong><\/p>\n\n\n\n<p>Ak vytv\u00e1rame nov\u00e9 tabulky, je dobr\u00e9 si ich nakresli\u0165 a posp\u00e1ja\u0165 si ich vz\u00e1jomn\u00e9 rel\u00e1cie. Tabulky je potrebn\u00e9 navrhnu\u0165 tak, aby neboli zbyto\u010dne velk\u00e9 a aby pracovali s \u010do mo\u017eno najmenej oper\u00e1ciami. V \u017eiadnom pr\u00edpade neuklada\u0165 do tabuliek d\u00e1ta (obr\u00e1zky, hudbu, s\u00fabory)<\/p>\n\n\n\n<p>Ak u\u017e m\u00e1me \u017eiv\u00fd projekt, ve\u013emi ta\u017eko sa n\u00e1m men\u00ed celkov\u00e1 \u0161trukt\u00fara tabuliek. V tak\u00fdchto pr\u00edpadoch m\u00f4\u017eeme v\u00fdu\u017ei\u0165 napr\u00edklad pridanie tabulky, ktor\u00e1 n\u00e1m zjednodu\u0161i po\u010det oper\u00e1ci\u00ed. Napr\u00edklad, ak m\u00e1me dve tabulky s relaciou n ku m (napr. n produktov a ka\u017ed\u00fd produkt ma m kategori\u00ed), vytvor\u00edme si referen\u010dn\u00fa tabulku, kde vlo\u017eime ka\u017ed\u00e9 spojenie produktu a kateg\u00f3rie. St\u00fapne n\u00e1m s\u00edce &nbsp;objem d\u00e1t, ale u\u0161etr\u00edme si t\u00fdm ve\u013ek\u00e9 mno\u017estvo oper\u00e1ci\u00ed.<\/p>\n\n\n\n<p><strong>INDEXY &nbsp;a EXPLAIN<\/strong><\/p>\n\n\n\n<p>Pre \u010do najr\u00fdchlej\u0161ie v\u00fdhladavanie v tabulk\u00e1ch je potrebn\u00e9 ma\u0165 spr\u00e1vne nastaven\u00e9 indexy. Je to vlastne d\u00e1tov\u00e1 strukt\u00fara, ktor\u00e1 n\u00e1m ur\u00fdchluje vzh\u013ead\u00e1vanie. Existuje jedno pravidlo,&nbsp;<strong>\u017ee v\u0161etko, \u010do m\u00e1me za where by malo ma\u0165 index<\/strong>. Je dobr\u00e9 sa ho dr\u017ea\u0165, ale treba indexy voli\u0165 rozumne, nakolko nie je dobr\u00e9 mat nadefinovan\u00fdch prive\u013ea indexov.<\/p>\n\n\n\n<p>Rovnako mus\u00edme zadefinova\u0165 index aj v pr\u00edpade, \u017ee sp\u00e1jame viac tabuliek. JOIN, LEFT JOIN\u2026<\/p>\n\n\n\n<p>Ak si nevieme rady, ako zadefinova\u0165 spr\u00e1vne index, m\u00f4\u017eeme pou\u017ei\u0165 pr\u00edkaz EXPLAIN. Vysklad\u00e1me si n\u00e1\u0161 po\u017eadovan\u00fd select a potom len pred select vlo\u017e\u00edme EXPLAIN. Tento pr\u00edkaz n\u00e1m poskytne v\u00fdpis existuj\u00facich kl\u00fa\u010dov, navrhne nov\u00e9 k\u013e\u00fa\u010de a vyp\u00ed\u0161e n\u00e1m aj \u00fadaj o tom, ko\u013eko riadkov je potrebn\u00e9 prehlada\u0165, k\u00fdm sa dostaneme k v\u00fdsledku.<\/p>\n\n\n\n<p>V pr\u00edpade viacer\u00fdch podmienok za WHERE n\u00e1m zv\u00fdsi r\u00fdchlos\u0165 zadefinovanie zlo\u017een\u00fdch indexov.<\/p>\n\n\n\n<p><em>CREATE INDEX zlozeny_index on TABLE (st\u00edpec1, st\u00edpec2) ;<\/em><\/p>\n\n\n\n<p><strong>QUERY<\/strong><\/p>\n\n\n\n<p>Ka\u017ed\u00e9 query, ktor\u00e9 vol\u00e1me by mali sp\u00edna\u0165 nasledovn\u00e9 body:<\/p>\n\n\n\n<ul><li>pou\u017e\u00edva\u0165 INDEXY pri WHERE, JOIN a ORDER<\/li><li>pou\u017e\u00edva\u0165 LIMIT a selectovat len tolko riadkov, ko\u013eko naozaj potrebujeme<\/li><li>nepou\u017e\u00edva\u0165 ve\u013ek\u00e9 d\u00e1tov\u00e9 typy BIGINT,..<\/li><li>pri JOIN pou\u017e\u00edva\u0165 rovnak\u00e9 d\u00e1tove typy a rovnakej velkosti<\/li><li>definova\u0165 si, ktor\u00e9 st\u00edpce chceme selectovat, nie select . from\u2026<\/li><li>pou\u017eivat SELECT DISTINCT iba ak je to nutn\u00e9<\/li><\/ul>\n\n\n\n<p><strong>vyhlad\u00e1vanie a diakritika<\/strong><\/p>\n\n\n\n<p>Ak prehlad\u00e1vate ve\u013ek\u00e9 textov\u00e9 polia, je r\u00fdchlej\u0161ie pou\u017ei\u0165 LIKE ako REGEXP. Velk\u00e9 textove pokia sa zvykn\u00fa prehlad\u00e1va\u0165 full-textov\u00fdm prehlad\u00e1van\u00edm (MATCH .. AGAINST). Full-text v\u0161ak nedok\u00e1\u017eu detekova\u0165 text ak zad\u00e1me bez diakritiky a chceme aby na\u0161lo aj s diakritikou. LIKE dok\u00e1\u017ee najs\u0165 zhodu aj v pr\u00edpadoch, ak zad\u00e1me slovo bez diakritiky ak m\u00e1me data v utf-8 a tabulku mame v kodovan\u00ed&nbsp;utf8_general_ci.<\/p>\n\n\n\n<p>\u010eal\u0161ia mo\u017enost, ako optimalizova\u0165 vyhlad\u00e1vanie aj s diakritikou je t\u00e1, \u017ee si uprav\u00edme n\u00e1\u0161 text do standardizovan\u00e1ho tvaru bez diakritiky ulo\u017e\u00edme si ho do dal\u0161ieho st\u013apca a prehlad\u00e1vame upraven\u00fd text.<\/p>\n\n\n\n<p>V \u010fal\u0161ej \u010dasti sa pozrieme na to, ako upravi\u0165 nastavenia na servery, cache a kompresiu tak, aby mala str\u00e1nka \u010do najr\u00fdchlej\u0161iu odozvu.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Zdroj : https:\/\/www.speedweb.sk\/blog\/ako-zrychlit-nacitavanie-webu-1-cast\/<\/p>\n\n\n\n<p>Zdroj : https:\/\/www.speedweb.sk\/blog\/ako-zrychlit-nacitavanie-webu-2-cast\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>V poslednom obdob\u00ed som viac kr\u00e1t rie\u0161il probl\u00e9m s na\u010d\u00edtavan\u00edm webov\u00fdch str\u00e1nok, ktor\u00fdm sa zva\u010d\u0161il objem d\u00e1t (hlavne v datab\u00e1ze). Prvotn\u00e9 reklam\u00e1cia smerovala samozrejme na server a jeho v\u00fdkon. Po par testoch sa v\u0161ak zistilo, \u017ee v\u00fdkon je v poriadku a server sa nudi aj v pr\u00edpade, \u017ee sa str\u00e1nka na\u010d\u00edtava 3-4 sekundy. Pozrieme sa [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/posts\/176"}],"collection":[{"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/comments?post=176"}],"version-history":[{"count":2,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/posts\/176\/revisions"}],"predecessor-version":[{"id":178,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/posts\/176\/revisions\/178"}],"wp:attachment":[{"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/media?parent=176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/categories?post=176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wiki.activenet.sk\/index.php\/wp-json\/wp\/v2\/tags?post=176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}