![]() |
![]() |
![]()
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.
Ponadto wybieram tez najstarsza i najmłodsza osobę z danym rozmiarem buta poleceniem:
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 ? -------------------- |
|
|
![]() |
![]()
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 |
|
|
![]()
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?
-------------------- |
|
|
![]()
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. |
|
|
![]()
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 ![]() -------------------- |
|
|
![]()
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ń
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 10:02 |