Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MYSQL]phpmyadmin - indeksy dla tablic - jakie?
konrados
post 21.11.2008, 16:26:55
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
dr_bonzo
post 21.11.2008, 16:36:03
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.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
phpion
post 21.11.2008, 16:42:40
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 smile.gif

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





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

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


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
Go to the top of the page
+Quote Post
phpion
post 21.11.2008, 16:52:21
Post #5





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




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
Go to the top of the page
+Quote Post
konrados
post 21.11.2008, 17:12:19
Post #6





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

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


OK, dzięki, to ułatwia życie.
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 Wersja Lo-Fi Aktualny czas: 5.05.2025 - 07:27