https://blog.superhosting.bg/website-resources-part2.html

Натиснете ENTER, за да видите резултатите или ESC за изход.

Сайтът ми зарежда бавно… Защо? (част 2)

2013-04-11
Съвети от support-a
бавен сайт, сайта зарежда бавно, неоптимална заявка, mysql, mysql завка, бавна заявка, бавна sql заявка, неоптимална sql заявка, sql завка, база данни, база от данни, Order by rand, sum, count, group by, order by, mysql sum, mysql count, mysql group by, mysql order by, index mysql, index, индекс, индекс база данни, индекс mysql, null, сайт забавяне, съвети от support- a, съвети, support, съвети от support

Влияе ли скоростта на зареждане на сайта върху потребителското изживяване? Отговора е ясен и ендозначен – ДА, влияе върху потребителското изживяване, емоцията от сайта и решението за покупка. Има много статистики по темата и според някои изследвания (Акамаи и Гомез) 40% от посетителите на даден сайт ще го напуснат, ако се зарежда за повече от няколко (2-3) секунди. На въпроса „Дали, ако сайтът зарежда бавно, биха намерили друг сайт, от който да пазаруват“, 14% са отговорили с „Да“, а ако моментът е пиков, техният брой скача на 75%. Тези и още много други примери доказват, че скоростта на зареждане на вашия уеб сайт е много важна за вас и посетителите. Затова с техническия екип на нашата хостинг компания подготвихме тази поредица от публикации, част от рубриката „Съвети от support- a“, в които да опишем най-често срещаните причини сайт да зарежда бавно и какви са стъпките и решенията.

Вече публикувахме част 1:

Сайтът ми зарежда бавно… Защо? (част 1)

Както и в първата част, така и тук, ще отделим няколко реда, в които да повторим какви са първите стъпки, които трябва да предприемете, ако забележите, че сайтът ви зарежда бавно:

Диагностиката е много важна част за откриването на причините, поради които един сайт може да зарежда бавно. За целта наблюдавайте:

  1. Кога се получава забавяне? – Добре е да се провери дали е повтаряемо във времето – получава се в определено време на деня или е еднократно.
  2. При какви действия се получава забавяне? – При отваряне, при разглеждане на сайт, при добавяне на информация или др.
  3. На всички страници и/или само на определен адрес се забелязва забавяне?
  4. При други сайтове забелязвате ли забавяне?
Какви са най-честите причини?

  1. Изтегляне на външни ресурси в реално време
  2. Неоптимални SQL заявки към базата данни
  3. Скриптове, които отнемат много време за обработка
  4. Голям обем на елементите на страница

Причина #1 – Изтегляне на външни ресурси в реално време, разгледахме в първата блог публикация от поредицата тук >>.

В следващите редове ще разгледаме причина #2, а именно – Неоптимални SQL заявки към базата данни.

Характерна особеност при неоптимални заявки е, че забавянето се наблюдава най-често при определени действия или при зареждането на определени страници. Например, ако е налична бавна заявка при показване на категориите в сайта, то може да се забележи забавяне само там. При останалите страници зареждането е бързо и коректно.

Информация за бавните заявки може да бъде изведена по няколко начина:
  • в самото приложение да се ползва tool, който да дава информация за заявките, които се изпълняват. Например, в Joomla може да се пусне режим на разработка (debug mode), за WordPress може да се инсталира допълнителен плъгин;
  • сайтът да бъде преместен и анализиран локално;
  • да се свържете с Техническата поддръжка. 🙂
Какво означава “неоптимална SQL заявка”?

При разработването на уеб сайтове е прието SQL заявките да се изпълняват под 1 секунда. Заявки, които се изпълняват за време над 1 секунда, са бавни заявки.

Какво се случва, ако има SQL заявка, която отнема много време за своето изпълнение?

При наличието на 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-ите в голяма степен помагат. При увеличаване на обема на данните, обаче, не винаги индексите дават достатъчно добри резултати. Тогава трябва да се помисли за преработка на самата заявка.

Агрегатни фунцкии и оператори в MySQL

Тук ще обърнем внимание на още няколко функции и оператори:

sum(), count(), group by, order by и др.

При ползването им, резултатът от изпълнение на заявката се копира във временна таблица на диска, след което се изпълнява съответното действие (сумиране, преброяване, групиране, подреждане и т.н.)

Ползването им трябва да бъде с повишено внимание, тъй като в някои случаи при тях може да не се ползва индекс и нарастването на обема на обработваната информация може да доведе до забавяне в работата на сайта.

Подобен пример дадохме в една от предишните статии – Бърз сайт = бързи SQL заявки! (част 1), където обърнахме внимание на Order by rand(). С нарастването на обема данни в базата данни, заявка съдържаща Order by rand() става с все по-неоптимално изпълнение.

Записването на всякакви видове статистики в база данни е неоптимално, защото води до натрупване на големи обеми от данни. В определени случаи това може да доведе до бавно зареждане на сайта, независимо от хостинг решението, което се ползва.
Съвет от съпорта:

Напомняме, че много важна част при разработката на динамичен сайт е да се обърне внимание на заявките, които се изпълняват към SQL сървъра. Те трябва да бъдат добре структурирани и да обработват само необходимата информация, без излишно избрани редове и колони. Така ще се избегне получаването на забавяне или съобщения за грешки в сайта, заради заявки, които се изпълняват неоптимално.

Когато разработвате приложения, винаги тествайте SQL заявките с голям обем от данни. Така ще можете да локализирате различни случаи още при разработката на сайта и да подсигурите коректната му работа още в началото.

Вие какво ще допълните към темата? А към съветите? 🙂

СуперХостинг.БГ

СуперХостинг.БГ е СуперЕкипът! Ежедневно всеки дава най-доброто от себе си, за да можете вие, клиентите на СуперХостинг.БГ, да сте номер едно. СуперСилата на СуперЕкипа е, че винаги е готов да ви даде точната информация, тази от която се нуждаете и за която питате.

500px270px
SuperHosting.BG

Препоръчани статии

Оставете коментар

1 Коментар към "Сайтът ми зарежда бавно… Защо? (част 2)"

Уведоми ме при
avatar
wpDiscuz