opened image

Jak skonfigurować i zoptymalizować serwer MySQL na VPS

Jedną z najczęściej używanych i popularnych relacyjnych baz danych jest MySQL.  Aplikacje internetowe i usługi często opierają się na tej bazie danych. Jednak aby osiągnąć stabilną pracę i wysoką wydajność, wymagana jest odpowiednia konfiguracja MySQL, szczególnie podczas uruchamiania go na VPS. Optymalizacja serwera MySQL pozwala efektywnie wykorzystać zasoby i poprawić czas reakcji na zapytania, co jest szczególnie ważne dla aplikacji o dużym obciążeniu.

 

MySQL: instalacja na VPS

 

Instalacja MySQL na Twoim serwerze jest niezbędna przed rozpoczęciem optymalizacji. Aby zrozumieć, jak to zrobić, przedstawimy Ci krok po kroku instrukcję tego procesu dla dwóch systemów operacyjnych. 

 

Proces instalacji dla Ubuntu/Debian

 

  1. Zainstaluj najnowszą wersję menedżera pakietów:
    sudo apt update

      2. Przeprowadź instalację MySQL:
            sudo apt install mysql-server


 

3. Następnym krokiem należy uruchomić MySQL, a następnie skonfigurować automatyczne uruchamianie przy starcie systemu operacyjnego:
sudo systemctl start mysql
sudo systemctl enable mysql

 

 

Proces instalacji dla CentOS/RHEL

 

  1. Należy zainstalować MySQL z repozytorium:
    sudo yum install mysql-server

  2. Następnie należy uruchomić MySQL i skonfigurować autostart:
    sudo systemctl start mysqld
    sudo systemctl enable mysqld

  3. Uruchom konfigurację początkową w celu poprawy bezpieczeństwa:
    sudo mysql_secure_installation

 

MySQL: proces optymalizacji

 

Aby zwiększyć wydajność, należy wprowadzić zmiany w konfiguracji MySQL po zakończeniu procesu instalacji. Optymalizacja obejmuje kilka obszarów: buforowanie, indeksowanie i ustawienia konfiguracyjne.

1. Ustawienia buforowania

Buforowanie w MySQL pozwala przechowywać dane, które są często żądane, co zmniejsza obciążenie bazy danych i przyspiesza czas reakcji. Poniżej przedstawiamy listę podstawowych parametrów do konfiguracji buforowania:

  • query_cache_size — rozmiar pamięci podręcznej zapytań. Większy rozmiar poprawia wydajność.

  • query_cache_limit — limit rozmiaru wyników, które można buforować.

  • innodb_buffer_pool_size — kluczowy parametr dla InnoDB, który ustala ilość pamięci przeznaczonej do przechowywania danych i indeksów w pamięci podręcznej.

Podczas konfigurowania buforowania MySQL zmiany najczęściej wprowadza się w pliku my.cnf, który znajduje się w katalogu /etc/mysql/ lub /etc/ na większości serwerów Linux.

Oto szczegółowy przewodnik dotyczący stosowania parametrów buforowania:

 

Krok 1: Otwórz plik konfiguracyjny MySQL

Otwórz plik my.cnf do edycji. W zależności od systemu może być konieczne wykonanie polecenia jako administrator:

sudo nano /etc/mysql/my.cnf

 

Krok 2: Znajdź sekcję [mysqld]

Aby parametry buforowania działały na serwerze MySQL, muszą być włączone w sekcji [mysqld].

 

Krok 3: Wprowadzenie parametrów buforowania

Skopiuj poniższe konfiguracje i zastosuj je w dokumencie my.cnf w sekcji [mysqld]:

 

[mysqld]

query_cache_type = 1          # Aktywacja buforowania zapytań

query_cache_size = 64M        # Ustalenie rozmiaru buforu 

query_cache_limit = 1M        # Maksymalny rozmiar wyniku zapytania do buforowania

table_open_cache = 2000       # Całkowita liczba tabel przechowywanych w pamięci podręcznej

thread_cache_size = 50        # Liczba wątków, które mogą być przechowywane w pamięci podręcznej


 

Uwaga: Ustawione wartości, na przykład 64M dla query_cache_size, można zmienić według własnych potrzeb.

Krok 4: Zrestartuj MySQL, aby zmiany weszły w życie

Po edytowaniu należy zapisać plik i wyjść z edytora. W tym celu należy zrestartować MySQL za pomocą polecenia:

sudo systemctl restart mysql


 

Sprawdzenie ustawień buforowania

Aby sprawdzić, czy zmiany weszły w życie, należy wykonać polecenie:

SHOW VARIABLES LIKE 'query_cache%';

SHOW VARIABLES LIKE 'table_open_cache';

SHOW VARIABLES LIKE 'thread_cache_size';

 

Te polecenia wyświetlą aktualny stan parametrów, pozwalając sprawdzić ich poprawność i w razie potrzeby dostosować ustawienia.

2. Indeksowanie tabel

Indeksowanie w MySQL — to metoda poprawy wydajności, która pozwala zoptymalizować wyszukiwanie i pobieranie informacji z bazy danych. Indeksy są tworzone dla kolumn tabel i pomagają serwerowi MySQL szybciej znajdować wiersze, które spełniają warunki zapytania, poprzez zmniejszenie liczby przeszukiwanych wierszy. Podobnie jak spis treści w książce, indeks wskazuje, gdzie można znaleźć potrzebne dane, nie przeszukując całego zbioru informacji.

Dlaczego potrzebne jest indeksowanie?

  1. Przyspieszenie zapytań: indeksy zapewniają szybsze wykrywanie i pobieranie informacji przez serwer MySQL, co znacznie zwiększa efektywność przetwarzania zapytań.

  2. Zmniejszenie obciążenia serwera: liczba operacji we/wy, dzięki indeksowaniu, staje się mniejsza, co ułatwia przetwarzanie zapytań i w rezultacie zmniejsza obciążenie serwera.

  3. Optymalizacja operacji łączenia (JOIN): indeksy pomagają szybciej znajdować i porównywać wiersze podczas łączenia kilku tabel.

  4. Poprawa sortowania i grupowania: przy użyciu indeksów MySQL może szybciej wykonywać operacje ORDER BY i GROUP BY.

 

Kiedy i jakie indeksy stosować?

  • Klucz główny (PRIMARY KEY): tworzony dla unikalnego identyfikatora każdego rekordu (np. identyfikator użytkownika). MySQL automatycznie tworzy indeks dla klucza głównego.

  • Indeksy unikalne (UNIQUE): stosowane dla pól, których wartości muszą być unikalne (np. email).

  • Indeksy zwykłe (INDEX): przydatne dla kolumn często używanych w warunkach wyszukiwania WHERE lub w łączeniach JOIN.

  • Indeksy złożone: indeksują jednocześnie kilka kolumn, co jest wygodne do optymalizacji złożonych zapytań z wieloma warunkami.

 

Przykłady zastosowania indeksowania

 

Przyjrzyjmy się kilku rzeczywistym przypadkom, w których stosowane są indeksy.

1. Indeksowanie kolumny z częstymi zapytaniami

Załóżmy, że mamy tabelę orders zawierającą kolumny id, customer_id oraz status. Jeśli zapytania często wybierają zamówienia według statusu, to aby znacznie zwiększyć szybkość wykonywania takich zapytań, należy stworzyć indeks dla kolumny status.

CREATE INDEX idx_status ON orders(status);

Po wykonaniu zapytania:

SELECT * FROM orders WHERE status = 'completed';

MySQL będzie używać indeksu do szybkiego wyszukiwania wierszy z status = 'completed', nie przeszukując wszystkich wierszy tabeli.

 

2. Indeksy unikalne dla ograniczenia danych

Jeśli chcemy ograniczyć duplikację w polu email tabeli users, możemy stworzyć unikalny indeks:

CREATE UNIQUE INDEX idx_email ON users(email);

Teraz próba wstawienia powtarzającego się emaila spowoduje błąd, ponieważ unikalny indeks zabrania duplikatów.

 

3. Indeksy dla złożonych zapytań, składające się z kilku komponentów

Kiedy mamy zapytania, które często wybierają dane według kilku pól, na przykład według firstname i lastname w tabeli employees, można stworzyć złożony indeks:

CREATE INDEX idx_name ON employees(firstname, lastname);

Teraz, przy wykonaniu polecenia:

SELECT * FROM employees WHERE firstname = 'John' AND lastname = 'Doe';

Wybór będzie przeprowadzany szybciej, ponieważ MySQL będzie używać złożonego indeksu i nie będzie już potrzeby sprawdzania wszystkich rekordów.

Indeksy: utrzymanie i aktualizacja

Warto pamiętać, że główna rekomendacja polega na tym, że indeksowanie powinno dotyczyć tylko kolumn, które często uczestniczą w zapytaniach, a także od czasu do czasu przeglądać ich aktualność. Indeksy aktywnie wykorzystują przestrzeń dyskową, znacznie spowalniają proces aktualizacji, usuwania rekordów oraz wstawiania. Powodem tego jest konieczność przeliczenia przy każdej zmianie danych.

Indeksy: przykład monitorowania

Możesz skorzystać z następującego polecenia, aby zobaczyć indeksy:

SHOW INDEX FROM orders;

Daje to nam informacje o tym, jakie indeksy zostały utworzone, ich typ oraz na jakie kolumny są stosowane.

3. Ustawienia parametrów połączeń

Parametry odpowiadające za liczbę jednoczesnych połączeń pozwalają elastycznie zarządzać obciążeniem serwera. Główne parametry:

  • max_connections — maksymalna liczba połączeń.

  • wait_timeout — czas oczekiwania na zakończenie nieaktywnych połączeń.

[mysqld]

max_connections = 200

wait_timeout = 600

Wsparcie i monitorowanie MySQL

Aby utrzymać wydajność MySQL, ważne jest, aby monitorować jego stan i okresowo przeprowadzać optymalizację. Użyj następujących podejść:

  • Monitorowanie procesów MySQL: aby obserwować wykonywane zapytania, można używać poleceń SHOW PROCESSLIST lub specjalistycznych narzędzi.

Regularnie przeprowadzaj proces optymalizacji tabel, stosując odpowiednie polecenie:
OPTIMIZE TABLE table_name;

  • Automatyzacja monitorowania: Skonfiguruj monitorowanie za pomocą takich narzędzi, jak MySQL Workbench, Percona Monitoring and Management lub Grafana, aby stale obserwować wydajność.

 

 

Podsumowanie

Konfiguracja i optymalizacja MySQL na VPS pomagają zwiększyć efektywność i stabilność działania aplikacji. Stosując opisane metody, możesz poprawić szybkość przetwarzania danych, zmniejszyć opóźnienia i zwiększyć niezawodność działania serwera MySQL. Regularne aktualizacje i monitorowanie ustawień pomagają utrzymać wysoką wydajność w dłuższej perspektywie.

Indeksowanie — to ważna technika optymalizacji wydajności MySQL. Zyskuje szczególną efektywność przy pracy z zapytaniami zawierającymi filtrowanie i sortowanie, a także z dużymi tabelami. W przypadku prawidłowego stosowania indeksów znacznie poprawia się szybkość działania bazy danych. Niemniej jednak ważne jest, aby pamiętać o ostrożnym ich stosowaniu, z naprawdę istotnymi kolumnami do spełnienia warunków wyszukiwania, sortowania lub łączenia.