Головна MySQL Оптимальне використання MySQL
Оптимальне використання MySQL

В процесі надання послуг хостингу ми звертаємо увагу на помилки, що найчастіше зустрічаються, які здійснюють користувачі при розробці своїх віртуальних серверів. Одним з "важких" місць для типового веб-майстра є робота з MySQL-сервером. Звичайне вивчення принципів функціонування SQL і методів роботи з базами даних ведеться по літературі, з якої вибираються тільки актуальні на момент читання речі, - як з'єднатися з базою, як зробити запит, як відновити інформацію або додати новий запис в базу даних і так далі.

Такий підхід, звичайно, дає бажаний результат - інтерфейси веб-сайту користувача у результаті виявляються інтегрованими з базою даних. Проте не завжди користувачі замислюються про те, наскільки оптимально працює їх база, як можна оптимізувати ті що відбуваються при роботі з MYSQL процеси і яке буде функціонування віртуального сервера при навантаженні, що збільшилась кількість користувачів в результаті, наприклад, "розкручування" сайту.

Ця стаття допоможе Вам оптимізувати роботу з СУБД MYSQL. Викладений матеріал не претендує на детальний опис оптимізації MYSQL взагалі, а лише звертає увагу на найчастіші омилки зроблені користувачами і розповідає про те, як їх уникнути. Детальніше дізнатися про тонкощі настройки MYSQL можна на спеціалізованих сторінках, посилання на які приведені в кінці цієї статті.

Які дані потрібно зберігати в MYSQL

Не старайтесь помістити в бази даних всю інформацію, яка у Вас є. Наприклад, не потрібно зберігати там картинки, хоч MYSQL це і дозволяє. Поміщаючи в базу даних двійкові образи графічних файлів, Ви тільки уповільните роботу свого сервера. Прочитати файл з картинкою з диска набагато простіше і, з погляду споживаних ресурсів, економічніше, ніж з'єднатися з скрипта до SQL, зробити запит, отримати образ, обробити його і, видавши потрібні http-заголовки, показати відвідувачеві веб-сервера. У другому випадку операція видачі картинки зажадає у декілька разів більше ресурсів процесора, пам'яті і диска. Також варто пам'ятати про те, що існують механізми кешування веб-документов, які дозволяють користувачеві економити на трафіку, а при динамічній генерації контента Ви фактично позбавляєте своїх відвідувачів цієї зручної можливості.

Замість картинок краще зберігати в MYSQL інформацію, на основі якої можна генерувати посилання на статичні картинки в динамічно створюваних скриптами документах.

Оптимізація запитів

У ситуаціях, коли реально потрібно отримати тільки певну порцію даних з MYSQL, можна використовувати ключ LIMIT для функції SELECT. Це корисно, коли, наприклад, потрібно показати результати пошуку чого-небудь в базі даних. Допустимо, в базі є список товарів, які пропонує Ваш інтернет-магазин. Видавати важ список товарів в потрібній категорії дещо негуманно по відношенню до користувача - канали зв'язку з інтернет не у всіх швидкі і видача зайвих ста кілобайт інформації часто примушує користувачів провести не одну хвилину в очікуванні результатів завантаження сторінки. У таких ситуаціях інформацію видають порціями, наприклад по 10 позицій.

Неправильно робити вибірку з бази всієї інформації і фільтрацію висновку скриптом. Набагато оптімальнєє буде зробити запит вигляду:

select good, price from books limit 20,10

В результаті, MYSQL "віддасть" Вам 10 записів з бази починаючи з 20-ої позиції. Видавши результат користувачеві, зробіть посилання "Наступні 10 товарів", як параметр передавши скрипту наступну позицію, з якою робитиметься виведення списку товарів, і використовуйте це число при генерації запиту до MYSQL.

Також слід пам'ятати, що при складанні запитів до бази даних (SQL queries) слід запрошувати тільки ту інформацію, яка Вам реально потрібна. Наприклад, якщо в базі 10 полів, а в даний момент реально потрібно отримати тільки два з них, замість запиту:

select * from table_name

використовуйте конструкцію виду:

select field1, field2 from table_name

Таким чином, Ви не навантажуватимете MYSQL непотрібною роботою, займати зайву пам'ять і здійснювати додаткові дискові операції.

Також слід використовувати ключ WHERE там, де потрібно отримувати інформацію, що потрапляє під певний шаблон. Наприклад, якщо потрібно отримати з бази поля з назвами книг, автором яких є Іванов, слід використовувати конструкцію вигляду:

select title from books where author='Іванов'

Також є ключ LIKE, який дозволяє шукати поля, значення яких "схожі" на заданий шаблон :

select title from books where author like 'Іванов%'

В даному випадку MYSQL видасть назви книг, значення поля author у яких починаються з 'Іванов'.

Ресурсоємні операції

Разом з тим слід пам'ятати, що існують операції, виконання яких саме по собі вимагає великих ресурсів, чим для звичайних запитів. Наприклад, використання операції DISTINCT до функції SELECT вимагає набагато більшої кількості процесорного часу, чим звичайний SELECT. DISTINCT намагається шукати унікальні значення, часто проводячи безліч порівнянь, підстановок і розрахунків. Причому, чим більше стає об'єм даних, до якого застосовується DISTINCT (адже Ваша база з часом росте), тим повільніше виконуватиметься такий запит і зростання ресурсів, потрібних для виконання такої функції, відбуватиметься не прямопропорційно об'єму даних, що зберігаються, а набагато швидше.

Індекси

Індекси використовують для швидшого пошуку по значенню одного з полів. Якщо індекс не створюється, то MYSQL здійснює послідовний перегляд всіх полів з найпершого запису до найостаннішого, здійснюючи зіставлення вибраного значення з результатним. Чим більше таблиця і чим більше в ній полів, тим довше здійснюється вибірка. Якщо ж у даної таблиці існує індекс для даного стовпця, то MYSQL зможе зробити швидке позиціонування до фізичного розташування даних без необхідності здійснювати повний перегляд таблиці. Наприклад, якщо таблиця складається з 1000 рядків, то швидкість пошуку буде як мінімум в 100 разів швидше. Ця швидкість буде ще вища, якщо є необхідність звернутися відразу до всіх 1000 стовпцям, оскільки в цьому випадку не відбувається витрат часу на позиціонування жорсткого диска.

У яких ситуаціях створення індексу доцільне:
Швидкий пошук рядків при використанні конструкції WHERE;
Пошук рядків з інших таблиць при виконанні об'єднання;
Пошук значення MIN() або MAX() для проіндексованого поля;
Сортування або угрупування таблиці у випадку, якщо використовується проіндексоване поле.

Якщо виконуються запити вигляду

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

і існує змішаний індекс для полів col1 і col2, то дані будуть повернені безпосередньо. Якщо ж створені окремі індекси для col1 і для col2, то оптимізатор спробує знайти найбільш обмежений індекс шляхом визначення того, який з індексів може знайти менше рядків, і використовуватиме цей індекс для отримання даних.
Якщо у таблиці є змішаний індекс, то використовуватиметься будь-який лівобічний збіг з існуючим індексом. Наприклад, якщо є змішаний індекс 3-х полів (col1, col2, col3), то індексний пошук можна здійснювати по полях (col1), (col1, col2) і (col1, col2, col3).

Підтримка з'єднання

Як Ви напевно знаєте, для роботи з MySQL-сервером необхідно заздалегідь встановити з ним з'єднання, пред'явивши логін і пароль. Процес установки з'єднання може продовжуватися набагато більший час, ніж безпосередня обробка запиту до бази після установки з'єднання. Слідуючи логіці, треба уникати зайвих з'єднань до бази, не від'єднуючись від неї там, де це можна зробити, якщо надалі планується продовжити роботу з SQL-сервером. Наприклад, якщо Ваш скрипт встановив з'єднання до бази, зробив вибірку даних для аналізу, не потрібно закривати з'єднання до бази, якщо в процесі роботи цього ж скрипта Ви плануєте результати аналізу помістити в базу.
Також можна підтримувати так зване persistent (постійне) з'єднання до бази, але це можливо в повному об'ємі при використанні складніших середовищ програмування, чим php або perl в звичайному CGI-режимі, коли інтерпретатор відповідної мови разовий запускається веб-сервером для виконання запиту, що прийшов.

 

Коментарі  

 
0 #2 Roseanna 07.02.2018 00:11
Just wish to say your article is as amazing. The clearness in your post is simply excellent and
i could assume you're an expert on this subject. Fine with your permission let me
to grab your feed to keep up to date with forthcoming post.

Thanks a million and please continue the rewarding work.


Feel free to surf to my website: Ghostwriter for Homework Assignments
Цитувати
 
 
0 #1 Kami 27.04.2017 08:16
I was reading some of your posts on this internet site and I believe this internet
site is rattling informative! Retain posting.


Feel free to surf to my web-site - взрослые женщины с
большой грудью
Цитувати
 

Додати коментар


Захисний код
Оновити

© 2008-2013 PHPist