![]() |
![]() ![]() |
![]() |
![]()
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? |
|
|
![]()
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.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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 ![]() Ten post edytował phpion 21.11.2008, 16:43:27 |
|
|
![]()
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 ? ![]() ![]() |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
no to jak to w końcu jest ? ![]() ![]() "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 |
|
|
![]()
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.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 5.05.2025 - 07:27 |