Optymalizacja bazy MySQL - część II
Wcześniej (Prędkość czy miejsce) pisałem, jak można zaprojektować tabelę MySQL aby baza działała szybciej lub zajmowała mniej miejsca. Teraz przedstawiam garść innych porad:
- używaj pól o jak najmiejszym rozmiarze
-
zmniejszenie rekordu redukuje ilość operacji dyskowych. Jeżeli przechowujesz hasło
w postaci hasza md5, użyj pola char(32) a nie varchar(100) - deklaruj kolumny jako NOT NULL
- zmniejszysz rozmiar rekordu
- dla tabel MyISAM używaj rekordu o stałej długości
- patrz: Prędkość czy miejsce
- podstawowy indeks tabeli powinien być tak mały, jak to możliwe
- przyspieszy to przeszukiwanie i tworzenie pliku indeksu
- twórz indeksy których naprawdę potrzebujesz
-
tworzenie i odczytywanie indeksu też zajmuje czas. Indeksuj te kolumny, których używasz
w części WHERE, ORDER BY lub GROUP BY zapytania. Nie musisz indeksować kolumn, których używasz tylko w części
SELECT - pierwsza kolumna złożonego klucza powinna być kolumną najczęściej używaną
- przyspieszy to przeszukiwanie indeksu
- jeżeli pobierasz wiele kolumn z tabeli, najpierw użyj kolumny posiadającej wiele duplikatów
- jeżeli kolumna ma unikalny prefiks na kilku pierwszych znakach, lepiej jest zindeksować tylko te kilka pierwszych znaków
- użyj do tego funkcji MySQL pozwalającej na tworzeniu indeksu lewej części kolumny znakowej
- w pewnych warunkach może przydać się podzielenie tabeli na dwie
- w ten sposób możesz uzyskać w jednej tabeli rekordy o stałej długości
- indeksy działają wydajniej dla kolumn, które mają dużą ilość unikalnych wartości w stosunku do ilości rekordów (ang. cardinality)
- lepiej działa indeks dla kolumny ‘login’ (wszystkie wartości unikalne) niż dla kolumny ‘wojewodztwo’ (tylko 16 różnych wartości)
- zwróć uwagę na typ pól podczas porównywania
-
jeżeli wyszukujesz rekordy na podstawie pola typu INTEGER, nie używaj porównania tego pola z typem STRING
(np. WHERE id = ‘78′). Lepiej porównuj pola tego samego typu (np. WHERE id = 78). Jeżeli porównujesz wartość
pola z wartością innego pola, zadbaj aby miały one ten sam typ. Dzięki temu unikniesz konieczności rzutowania.
Pamiętaj także, że int i bigint to inne typy pól oraz char(10) nie odpowiada polu char(12). - staraj się umieszczać indeksowane samotnie po jednej stronie porównania
-
w przeciwnym wypadku MySQL nie będzie mógł użyć indeksów.
Lepszą wydajność uzyskasz pisząc ‘WHERE i < 4 / 2' niż 'WHERE i *2 < 2' - nie używaj znaków wieloznacznych na początku porówanania LIKE
- używaj pól typu ENUM jeżeli to możliwe
listopad 22nd, 2006 at 22:53:24
[…] http://www.netcoffee.pl/pogodzinach/2006/01/15/optymalizacja-bazy-mysql-czeae-ii/ […]
listopad 28th, 2006 at 23:47:20
tekst jes dobry, mała kompilacja dla początkujących, trochę przypomina mi książkę ‘core MySQL’ Leona Atkinsona :)
grudzień 8th, 2006 at 00:49:59
Dokumentacja mysql’a to nie wszystko ;P
To też warto przeczytać
http://pl.wikibooks.org/wiki/Programowanie:PHP:Relacje_i_indeksy