Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zakladanie indeksów
KR2615
post
Post #1





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

Ostrzeżenie: (0%)
-----


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 ?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Mchl
post
Post #2





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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ś.

Ten post edytował Mchl 21.04.2010, 14:30:58
Go to the top of the page
+Quote Post
KR2615
post
Post #3





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

Ostrzeżenie: (0%)
-----


A czy z polem date też mam coś robić? Przecież według niego szereguję userów, conie?


--------------------
Go to the top of the page
+Quote Post
Mchl
post
Post #4





Grupa: Zarejestrowani
Postów: 855
Pomógł: 145
Dołączył: 17.07.2008
Skąd: High Memory Area

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
KR2615
post
Post #5





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

Ostrzeżenie: (0%)
-----


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


--------------------
Go to the top of the page
+Quote Post
wujekleon
post
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 1.05.2010

Ostrzeżenie: (0%)
-----


Generalnie można tworzyć indeksy dla pól, po których się dokonuje przeszukań
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 10:02