6.1 Въведение
Сега нека преминем от теория към практика.
Ние живеем в реалния свят и всички софтуерни продукти в крайна сметка са създадени за живи хора. И тези живи хора много се дразнят от сайтове, които зареждат бавно, и програми, които се бавят.
И ако една заявка към база данни отнема повече от секунда, това е неприемливо . Потребителите просто няма да използват продукт, който има толкова бавни страници/функционалност.
Но често, за да покажете една page, трябва да извършите няколко десетки заявки към базата данни. И ако се изпълняват последователно, тогава вече нямате втори лимит, а да кажем 100ms на заявка.
Ето топ 5 начина, по които програмистите ускоряват заявките към базата данни:
- Добавяне на индекси към таблици в базата данни.
- Пренаписване и оптимизиране на заявки.
- Активирайте (и конфигурирайте) кеширане от страна на базата данни.
- Активирайте кеширането от страна на клиента.
- Извършва денормализиране на база данни.
Вече сте запознати с всички тези неща в по-голямата си част, така че следното ще бъде само практически съвет.
6.2 Индекси
Не е тайна, че работата с база данни заема по-голямата част от работата на почти всеки сайт. И именно работата с базата данни най-често е тясното място на уеб applicationsта.
В тази статия бих искал да дам практически съвети за използването на MySQL.
Веднага ще кажа:
- тази статия е написана за MySQL, въпреки че общите неща вероятно са верни за всяка СУБД.
- Всичко написано в статията е моя лична гледна точка и не е истината от последна инстанция.
- съветът не претендира за нов и е резултат от обобщение на прочетената литература и личен опит.
- в рамките на тази статия няма да засягам проблеми с конфигурацията на MySQL.
Проблемите при използване на MySQL могат да бъдат разделени на следните три групи (по важност):
- Неизползване or злоупотреба с индекси.
- Грешна структура на базата данни.
- Неправилни \ неоптимални SQL заявки.
Нека разгледаме по-подробно всяка от тези групи.
Използване на индекси
Неизползването or злоупотребата с индекси е това, което най-често забавя заявките. За тези, които не са запознати с механизма на работа на индексите or все още не са чели за това в ръководството, горещо ви съветвам да го прочетете.
Съвети за използване на индекси:
- Не е необходимо да индексирате всичко . Доста често, без да разбират смисъла, хората просто индексират всички полета на tableта. Индексите ускоряват извличането, но забавят вмъкванията и актуализациите на редове, така че изборът на всеки индекс трябва да е смислен.
- Един от основните параметри, които характеризират индекса, е селективността, която е броят на различните елементи в индекса. Няма смисъл да се индексира поле, което има две or три възможни стойности. Ще има малка полза от такъв индекс.
- Изборът на индекси трябва да започне с анализ на всички заявки спрямо дадена table. Много често след такъв анализ, instead of три or четири индекса, можете да направите един съставен.
- Когато използвате съставни индекси, редът на полетата в индекса е критичен.
- Не забравяйте за покриване на индекси. Ако всички данни в заявка могат да бъдат извлечени от индекс, тогава MySQL няма да има директен достъп до tableта. Такива заявки ще бъдат изпълнени много бързо. Например, за заявка
SELECT name FROM user WHERE login='test'
с индекс (влизане, име) не е необходим достъп до tableта. Понякога има смисъл да добавите допълнително поле към съставен индекс, което ще направи индекса покриващ и ще ускори заявките. - За индексите на редове често е достатъчно да се индексира само част от реда. Това може значително да намали размера на индекса.
- Ако
%
е в началото,LIKE(SELECT * FROM table WHERE field LIKE '%test')
няма да се използват индекси. - Индексът FULLTEXT се използва само със синтаксиса MATCH ... AGAINST .
6.3 Структура на базата данни
Добре проектираната база данни е ключът към бързата и ефективна работа с базата данни. От друга страна, зле проектираната база данни винаги е главоболие за разработчиците.
Съвети за дизайн на база данни:
- Използвайте възможно най-малките типове данни. Колкото по-голям е типът данни, толкова по-голяма е tableта, толкова повече дискови достъпи са необходими за получаване на данните. Използвайте много удобна proceduresа:
SELECT * FROM table_name PROCEDURE ANALYSE();
за определяне на минималните възможни типове данни. - Спазвайте нормалните форми по време на фазата на проектиране. Често програмистите прибягват до денормализация още на този етап. Въпреки това, в повечето случаи, в началото на проекта, далеч не е очевидно How може да доведе това. Денормализирането на table е много по-лесно, отколкото да страдате от неоптимално денормализирана. И
JOIN
понякога работи по-бързо от неправилно денормализирани таблици. - Не използвайте
NULL
колони, освен ако съзнателно не се нуждаете от тях.
6.4 SQL заявки.
Също толкова често има желание да се пренапишат всички заявки в родния SQL, така че заявката да е възможно най-бърза. Ако решите да направите това, ето няколко съвета:
- Избягвайте заявки в цикъл. SQL е език на набори и писането на заявки трябва да се подхожда не на езика на функциите, а на езика на наборите.
- Избягвайте
*
(звездички) в заявките. Чувствайте се свободни да посочите точно избраните от вас полета. Това ще намали количеството изтеглени и изпратени данни. Също така не забравяйте за покриване на индекси. Дори ако изберете всички полета в tableта, по-добре е да ги изброите. Първо , подобрява четливостта на codeа. Когато използвате звездички, е невъзможно да разберете Howви полета има в tableта, без да я разгледате. Второ , днес вашата table има пет INT колони, а месец по-късно бяха добавени още един TEXT и BLOB , а звездичката остана Howто беше. - Когато се пагинира, за да получите общия брой записи, използвайте
SQL_CALC_FOUND_ROWS
иSELECT FOUND_ROWS();
Когато се използваSQL_CALC_FOUND_ROWS MySQL
, кешира избрания брой редове (преди да се приложи LIMIT) и когато се използва,SELECT FOUND_ROWS()
връща само тази кеширана стойност, без да се налага повторно изпълнение на заявката. - Не забравяйте, че има
INSERT
синтаксис за множество вмъквания. Една заявка ще се изпълнява с порядък по-бързо от множество заявки в цикъл. - Използвайте
LIMIT
там, където нямате нужда от всички данни. - Използвайте
INSERT… ON DUPLICATE KEY UPDATE…
instead of иINSERT
orUPDATE
след избор и често instead ofREPLACE
. - Не забравяйте тази невероятна функция
GROUP_CONCAT
. Може да помогне при сложни заявки.
GO TO FULL VERSION