Często bywa tak, że “wąskim gardłem” aplikacji webowych staje się baza danych. Oczywiście można w takich przypadkach rozważać zakup lepszego serwera, a nawet utworzenie dedykowanej instancji dla bazy danych (co może być słuszne w części przypadków), jednakże dobrze jest się zastanowić, czy jest coś co możemy zrobić, by zmniejszyć obciążenie bazy danych bez konieczności wydawania kolejnych środków.
Dzisiejszy artykuł jest pierwszym z dwóch wpisów przedstawiających proste i bezbolesne techniki optymalizujące, dotyczące relacyjnej bazy danych MySQL.
1. Stałe połączenia
Połącz się raz i utrzymuj połączenie by uniknąć zbędnych narzutów związanych z rozłączaniem i ponownym łączeniem się do bazy danych. Dla języka PHP na przykład:
-
mysql_pconnect($server['host'], $server['username'], $server['password'])
2. Dobieraj typ indywidualnie do każdego pola
Zawsze dobieraj typ pola tak by odzwierciedlał dane jakie będą w nim zawarte. Czy na pewno potrzebujesz int(11) dla pola id? Zastanów się czy w polu “plec” naprawdę potrzebujesz typu text i wartości mężczyzna i kobieta, czy nie lepiej nadać typ bool i w komentarzy na pisać 0 – kobieta, 1 – mężczyzna? Z pewnością zaoszczędzi co to sporo RAM-u podczas wykonywania zapytania do bazy danych.
3. Analizuj tabele
Po utworzeniu tabeli i po wypełnieniu jej zestawem danych dobrze jest przeprowadzić operacje analizowania tabeli, co pozwoli MySQL-owi lepiej optymalizować tabele.
4. Czy moja tabela jest za długa?
Jeżeli zadajesz sobie to pytanie tylko dlatego, że w tabeli użytkowników masz już “za dużo” kolumn, to odpowiedz brzmi nie. Nie należy sztucznie dzielić tabel (jeżeli nie ma takiej potrzeby). Największe obciążenie jest w momencie wyszukiwania pierwszego bajtu tabeli.
5. Nie używaj pętli jeżeli nie ma takiej potrzeby
Jeżeli masz zestaw konkretnych id krotek, które chcesz pobrać z bazy danych to nie pobieraj ich pojedynczo w pętli, skoro możesz wykorzystać procedurę IN.
-
SELECT *
-
FROM `my_users`
-
WHERE `id` IN (1,5,15,45);
6. Definiuj wartości domyślne
Podczas tworzenia tabeli pamiętaj by zadeklarować domyślne wartości pól gdzie to jest tylko możliwe. W ten sposób podczas wykonywania zapytania nie musisz podawać wszystkich wartości pól, ponieważ jak ich nie podasz zostaną tam wstawione wartości domyslne, skracając tym samym czas potrzebny na sparsowanie tegoż zapytania.
7. Dane użytkownika
Jeżeli często potrzebujesz danych użytkownika i z jakiegoś powodu nie możesz ich przetrzymywać w sesji po zalogowaniu, zastanów się czy zamiast za każdym razem wykonywać zapytanie do tabeli użytkowników, nie przetrzymać tych danych w tabeli MEMORY
8. Sumy i liczniki
Często używając takich polecen jak SUM czy COUNT dobrze jest stworzyć osobną tabelę, którą system będzie uaktualniał z każdym dodanym wierszem (np. komentarzem). W ten sposób nie będziesz musiał wywoływać czasochłonnego zapytania na tabelę w której znajduje się duża liczba komentarzy, a jedynie wywołamy proste zapytanie do tabeli z licznikiem.
9. LIMIT 1 przy unikatowych wierszach
Zdarza się tak, że tworząc zapytanie dokładnie wiemy, że dostaniemy pojedynczy rekord – w takich sytuacjach dodanie LIMIT 1 potrafi zwiększyć wydajność zapytania. W takim przypadku silnik bazodanowy przestanie szukać po pierwszym znalezionym elemencie, nie marnując zasobów na przeszukiwanie dalszej części tabeli
10. Używaj INDEX-u na polach po których przeszukujesz
Jeżeli w tabeli (szczególnie dużej) znajdują się pola, po których przeprowadzasz wyszukiwanie, pamiętaj by nadać im atrybut INDEX. Dzięki takiemu rozwiązaniu zapytania mogą się wykonywać od kilku razy szybciej.
Naprawdę tak niewiele potrzeba żeby zwiększyć wydajność bazy danych, mam nadzieję, że wskazówki się przydadzą. W kontynuacji wpisu przedstawię kolejnych 10 sposobów na MySQL-a, które z pewnością warto znać.




6 komentarzy do “Pierwszych 10 sposobów na MySQL”
Dzięki za tricki – naprawdę niektóre pomocne i czekam na kolejne:)
wow, jesteś prawdziwym mysql-owym ninja
dzięki
Ad 8. Warto dodać, że do takiego triku warto zastosować wyzwalacze, żeby w bazie nie zrobił się bałagan.
Można też do tego zastosować widoki i je zindeksować – to chyba najszybszy sposób.
Ad 1. W PHP (chociaż w innych językach oczywiście też) istnieją obiekty do łączenia się z bazami danych.Korzystajmy z nich! Same dbają o utrzymanie łączności z bazą danych.
P.S. Czy mógłbyś poświęcić jakiś artykuł tabeli MEMORY? Po co jest i jak dokładnie działa? Szczerze mówiąc nie słyszałem wcześniej o niej.
re: Ad1. Obiekty faktycznie istnieją i dobrą praktyką jest z nich korzystać, lecz zawsze należy brać pod uwagę skalę aplikacji. A sposób miał za zadanie jedynie podkreślenie wagi stałego połączenia.
re: Ad. 8 oczywiście, że można, chociaż nie zawsze mamy dostęp do triggerów ponieważ komercyjne serwery często najnormalniej w świecie ich nie wspierają (np. nazwa.pl, home.pl) – jednakże uwaga słuszna
a propos MEMORY – to wpisane na moją listę to-dosów
Pierwszych 10 sposobów na MySQL 10 głosuj! Artykuł jest pierwszym z dwóch wpisów przedstawiających proste i bezbolesne [...]