Сайтът ми зарежда бавно... Защо? (част 2)
Влияе ли скоростта на зареждане на сайта върху потребителското изживяване? Отговора е ясен и ендозначен - ДА, влияе върху потребителското изживяване, емоцията от сайта и решението за покупка. Има много статистики по темата и според някои изследвания (Акамаи и Гомез) 40% от посетителите на даден сайт ще го напуснат, ако се зарежда за повече от няколко (2-3) секунди. На въпроса "Дали, ако сайтът зарежда бавно, биха намерили друг сайт, от който да пазаруват", 14% са отговорили с "Да", а ако моментът е пиков, техният брой скача на 75%. Тези и още много други примери доказват, че скоростта на зареждане на вашия уеб сайт е много важна за вас и посетителите. Затова с техническия екип на нашата хостинг компания подготвихме тази поредица от публикации, част от рубриката "Съвети от support- a", в които да опишем най-често срещаните причини сайт да зарежда бавно и какви са стъпките и решенията.
Вече публикувахме част 1:
Сайтът ми зарежда бавно... Защо? (част 1)
Както и в първата част, така и тук, ще отделим няколко реда, в които да повторим какви са първите стъпки, които трябва да предприемете, ако забележите, че сайтът ви зарежда бавно:
Диагностиката е много важна част за откриването на причините, поради които един сайт може да зарежда бавно. За целта наблюдавайте:
- Кога се получава забавяне? - Добре е да се провери дали е повтаряемо във времето – получава се в определено време на деня или е еднократно.
- При какви действия се получава забавяне? - При отваряне, при разглеждане на сайт, при добавяне на информация или др.
- На всички страници и/или само на определен адрес се забелязва забавяне?
- При други сайтове забелязвате ли забавяне?
- Изтегляне на външни ресурси в реално време
- Неоптимални SQL заявки към базата данни
- Скриптове, които отнемат много време за обработка
- Голям обем на елементите на страница
Причина #1 - Изтегляне на външни ресурси в реално време, разгледахме в първата блог публикация от поредицата тук >>.
Характерна особеност при неоптимални заявки е, че забавянето се наблюдава най-често при определени действия или при зареждането на определени страници. Например, ако е налична бавна заявка при показване на категориите в сайта, то може да се забележи забавяне само там. При останалите страници зареждането е бързо и коректно.
- в самото приложение да се ползва tool, който да дава информация за заявките, които се изпълняват. Например, в Joomla може да се пусне режим на разработка (debug mode), за WordPress може да се инсталира допълнителен плъгин;
- сайтът да бъде преместен и анализиран локално;
- да се свържете с Техническата поддръжка. 🙂
При разработването на уеб сайтове е прието SQL заявките да се изпълняват под 1 секунда. Заявки, които се изпълняват за време над 1 секунда, са бавни заявки.
При наличието на SQL заявка, която отнема много време за изпълнението си, в този момент на сайта се изчаква да се обработи информацията от SQL сървъра. В следствие на това се забелязва забавяне в зареждането на информацията в клиентския браузър.
Оптимизация на заявката зависи от конкретната заявка. В повечето случаи особено добър ефект оказват индексите.
Най-използваният тип индекси в MySQL (PRIMARY KEY, UNIQUE, INDEX и FULLTEXT) представляват дървовидна структура от данни, тип B-tree, която съхранява данните сортирани и позволява търсене, последователен достъп, вмъквания и др. Тази дървовидна структура е оптимизирана за системи, които четат и пишат на големи блокове от данни. Обикновено се използва в базите данни и файлови системи.
Изключения са индекси на пространствени данни като например географски координати, които са тип R-trees, a в MEMORY таблиците се поддържат hash индекси.
Информация дали се ползва index може да се извлече чрез ползване на explain.
Пример:
В MySQL (за улеснение може да се ползва phpMyAdmin) изпълняваме explain на SQL заявка. Ще видим подобен резултат:
|id|select_type|table | type |possible_keys|key|key_len|ref|rows| Еxtra |
+--+-----------+-----+------------------+------+---------------+------+-------------
| 1| SIMPLE | some_table | ALL | NULL |NULL| NULL | NULL | 166 |Using where|
+--+-+---------+---+---------------------+------+---------------+------+------------
Обърнете внимание в получения резултат на колоните rows и key. "Rows" дава информация колко реда са обработени, за да се изпълни заявката. Обикновено при добре структурирана заявка целта е да се обработват оптимален брой редове. Колоната "key" дава информация дали се ползва индекс и кой индекс се ползва. В случай, че пише NULL, както в посочения пример, това означава, че не се ползва индекс.
При поставянето на индекси трябва да се подхожда внимателно. Обикновено поставянето на индекси при where клаузи и при колони, които се ползват при join на таблици, дава желания резултат. След поставяне на индекс, отново чрез explain може да се види дали индексът се ползва от конкретната SQL заявка.
|id|select_type|table |type|possible_keys|key|key_len|ref| rows |Еxtra|
+--+-----------+-----+------------------+------+---------------+------+---------
| 1| SIMPLE |some_table| ref | Primary |Primary|128|const| 1 |Using where|
+--+-+---------+---+---------------------+------+---------------+------+---------
Index-ите в голяма степен помагат. При увеличаване на обема на данните, обаче, не винаги индексите дават достатъчно добри резултати. Тогава трябва да се помисли за преработка на самата заявка.
Тук ще обърнем внимание на още няколко функции и оператори:
sum(), count(), group by, order by и др.
При ползването им, резултатът от изпълнение на заявката се копира във временна таблица на диска, след което се изпълнява съответното действие (сумиране, преброяване, групиране, подреждане и т.н.)
Ползването им трябва да бъде с повишено внимание, тъй като в някои случаи при тях може да не се ползва индекс и нарастването на обема на обработваната информация може да доведе до забавяне в работата на сайта.
Подобен пример дадохме в една от предишните статии - Бърз сайт = бързи SQL заявки! (част 1), където обърнахме внимание на Order by rand(). С нарастването на обема данни в базата данни, заявка съдържаща Order by rand() става с все по-неоптимално изпълнение.
Напомняме, че много важна част при разработката на динамичен сайт е да се обърне внимание на заявките, които се изпълняват към SQL сървъра. Те трябва да бъдат добре структурирани и да обработват само необходимата информация, без излишно избрани редове и колони. Така ще се избегне получаването на забавяне или съобщения за грешки в сайта, заради заявки, които се изпълняват неоптимално.
Когато разработвате приложения, винаги тествайте SQL заявките с голям обем от данни. Така ще можете да локализирате различни случаи още при разработката на сайта и да подсигурите коректната му работа още в началото.
Вие какво ще допълните към темата? А към съветите? 🙂