Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zakladanie indeksów
Forum PHP.pl > Forum > Bazy danych > MySQL
KR2615
Witam. Dosyć szybko i nieoczekiwanie moja baza danych rozrosła się do ponad 3mln rekordów. Dotychcas nie miałem problemów z przeszukiwniem bazy przy domyślnych indeksach. Struktura mojej tabeli wyglada tak:

Kod
--------------------------------------------------------------
| id | name             | date        | size | sex |
|------------------------------------------------------------|
| 1  | Tomasz.Jan.Mariusz.Wujek    | 125842064     | 43   |  M  |
--------------------------------------------------------------


Poczałkowo miałem tylko index UNIQUE na polu name. Ponieważ jednak imiona i nazwiska sa zapisywane w formie 1-wszeimie.2-gieimie.3-cieimie.Nazwisko po przecytaniu kilku artykułów z Google stwierdziłem, ze lepiej będzie nadać temu polu index FULL TEXT i przeszukiwać je poleceniem MATCH. Dotychczasowe stosowanie wildcardow % było zbyt uciążliwe.

Mam jednak pewien skrypt do przeszukiwania tej bazy ktory wykonuje sie niesamowicie dlugo. Pobiera on przykładowo ilość wszystkich kobiet o numerze buta 42. W bazie mam ok. 3,2mln ludzi wiec wykonanie tego zapytania trwa ok. 3 sec.
  1. SELECT count(*) FROM people WHERE `size`='42' AND `sex`=F


Ponadto wybieram tez najstarsza i najmłodsza osobę z danym rozmiarem buta poleceniem:
  1. SELECT name FROM people WHERE `size`='42' ORDER BY `date` ASC LIMIT 1
  2. SELECT name FROM people WHERE `size`='42' ORDER BY `date` DESC LIMIT 1

Całkowity czas wykonania tego skryptu zajmuje nawet 10 sec! I tu rodzi sie moj problem: jakie indeksy nałożyć na pole size, ewentualnie sex, aby zapytanie trwało najkrócej? Z tego co wycszytałem w Internecie, indeksy są efektywne się na polach, gdzie jest mnóstwo różnych wartości. Moje pole size przyjmuje max kilkadziesiąt wartości ale za to każda ma po kilka tysięcy rekordów.

Proszę Was o pomoc jak zwiększyć wydajność mojej bazy ?
Mchl
Kod
ALTER TABLE people
ADD INDEX size_sex (size,sex),
ADD INDEX size_date (size,date)


A z tym polem name to sobie w stopę strzeliłeś.
KR2615
A czy z polem date też mam coś robić? Przecież według niego szereguję userów, conie?
Mchl
No i dlatego drugi z tych indeksów obejmuje to pole.
Zrób teraz te zapytania z EXPLAIN i sprawdź jak korzystają z indeksów.
KR2615
Pomogło. Rzeczywiście korzysta z tych kluczy (ktore zajmuja 3x wiecej miejsca niz baza!) a wykonanie zapytania wreszcie zajmuje normalna ilosc czasu (0.0096 sekund dla
SELECT name FROM people WHERE `size`='42' ORDER BY `date` ASC LIMIT 1) a cała strona generuje się poniżej 0.2 sekundy. Dzięki serdeczne za pomoc winksmiley.jpg
wujekleon
Generalnie można tworzyć indeksy dla pól, po których się dokonuje przeszukań
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.