Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL]phpmyadmin - indeksy dla tablic - jakie?
konrados
post
Post #1





Grupa: Zarejestrowani
Postów: 623
Pomógł: 79
Dołączył: 16.01.2008

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował phpion 21.11.2008, 16:43:27
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.04.2026 - 18:59