Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL]phpmyadmin - indeksy dla tablic - jakie?
Forum PHP.pl > Forum > Przedszkole
konrados
Witam,

Ogółem niby wiem co to są indeksy (klucze) ale gubię się, gdy chodzi o tworzenie indeksów dla wielu pól jednocześnie.

Mam pierwszą tabelę, gdzie trzymam "użytkowników", jest tam id,user_name itd.

Mam drugą tabelę, gdzie trzymam "wiadomości użytkowników", jest tam id, oraz: sender_id oraz recipient_id (które dotyczą id w pierwszej tabeli) itd... Czyli taki typowy przykład bardzo prostej relacji.

Chodzi mi (na razie) o tę drugą tabelę. Chcę tam stworzyć indeksy (używając phpMyAdmin) i chciałbym indeksować: id, sender_id oraz recipient_id (chyba słusznie?). I teraz: czy mam stworzyć JEDEN indeks zawierający wszystkie te kolumny, czy stworzyć 3 indeksy dla każdej z nich? Czy jest jakaś różnica potem w szybkościach?

p.s. Co to jest "MOC" w phpmyadmin przy indeksach? Google nie chce pomóc.

p.s.2 w tej pierwszej tabeli (gdzie jest min. user_name:varchar [64]) warto indeksować ów "user_name"? A jeśli tak to w jednym indeksie z ID czy w dwóch indeksach?

Update: w związku z brakiem odpowiedzi, potestowałem trochę, dodając różne indeksy dla różnych pól, no i ... zero różnicy, czas wykonania taki sam, może kilkanaście tysięcy rekordów to za mało by indeksowanie coś pomagało?
dr_bonzo
1. Indeksy dodajesz w zaleznosci jak korzystasz z danych

http://stronka/user/konrados => SELECT * FROM users WHERE user.name = 'konrados'
-> zakladasz index na user_name, w dodatku UNIQUE; nie robisz lacznego indeksu z ID bo po co?
popatrz potem co ci EXPLAIN pokaze, ktorego indeksu uzyje

2. Wiadomosci od userow?
- otrzymane wiadomosci
SELECT * FROM messages WHERE recipient_id = $twoj_user_id
- wyslane wiadomosci
SELECT * FROM messages WHERE sender_id = $twoj_user_id
- pokaz wiadomosc 123
SELECT * FROM messages WHERE id = 123

czyli 3 klucze, pojedyncze, na kazda z kolumn z osobna. index na 'id' powinien ci PRIMARY KEY juz zalatwic - nie musisz go dodawac osobno.
Jeden potrojny klucz jest bez sensu, przyda ci sie TYLKO gdy bedziesz wyszukiwal: ...WHERE recipient_id = $id1 AND sender_id = $id2 AND id = $id3 - a tak zapewne nie bedziesz z tego korzystal


3. Moc - 'Cardinality', ilosc roznych wartosci dla danego indexa, im wiecej roznych wartosci/ilosc rekordow tym indeks bardziej sie przydaje.
phpion
Cytat(dr_bonzo @ 21.11.2008, 18:36:03 ) *
czyli 3 klucze, pojedyncze, na kazda z kolumn z osobna. index na 'id' powinien ci PRIMARY KEY juz zalatwic - nie musisz go dodawac osobno.
Jeden potrojny klucz jest bez sensu, przyda ci sie TYLKO gdy bedziesz wyszukiwal: ...WHERE recipient_id = $id1 AND sender_id = $id2 AND id = $id3 - a tak zapewne nie bedziesz z tego korzystal

Czy aby na pewno tak jest? Z tego co czytałem (coprawda w książce dotyczącej MS SQL Server więc możliwe, że nie można tego odnieść do MySQL) nie do końca tak jest. Przykład: index zawiera 3 kolumny: kolumna1, kolumna2, kolumna3. Wyszukiwanie rekordów po kolumna1 oczywiście spowoduje użycie indeksu. To jest jasne. Jednak wyszukiwanie po kolumna2 również spowoduje jego użycie. Prawdą jest, że wystąpienie w warunku WHERE kolumny, która jest na pierwszym miejscu w indeksie jednoznacznie powoduje jego użycie. Jednak w przypadku wyszukiwania po innych kolumnach takowy indeks również może zostać użyty.

PS: Co nie zmienia faktu, że podane przez Ciebie sugerowane indeksy są jak najbardziej OK smile.gif
konrados
Cytat
Jeden potrojny klucz jest bez sensu, przyda ci sie TYLKO gdy bedziesz wyszukiwal: ...WHERE recipient_id = $id1 AND sender_id = $id2 AND id = $id3 - a tak zapewne nie bedziesz z tego korzystal

Dzięki! Właśnie o to mi chodziło.

Update: no to jak to w końcu jest ? smile.gif Jak na razie potworzyłem dużo indeksów, ale trochę pamięci zabierają sad.gif
phpion
Cytat(konrados @ 21.11.2008, 18:48:06 ) *
no to jak to w końcu jest ? smile.gif Jak na razie potworzyłem dużo indeksów, ale trochę pamięci zabierają sad.gif

"Co za dużo to nie zdrowo" - trzymaj się tego hasła zakłądając indeksy. Przyspieszają one wyszukiwanie ale spowalniają operacje zmiany danych (insert, update, delete) gdyż prócz danych zaktualizowane muszą zostac indeksy.

Co do sugerowanych indeksów trzymaj się tego, co napisał ~dr_bonzo:
- user_name - indeks unikalny
- recipient_id - indeks
- sender_id - indeks
konrados
OK, dzięki, to ułatwia życie.
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.