![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 11.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Mam pytanie odnośnie indeksacji tabel. Mam tabelę "languages" : id (int),name (varchar) ,iso (varchar) ,sequence (int). Przypuśćmy, że wykonuję na niej dwa zapytania: SELECT `Language`.`id`, `Language`.`iso`, `Language`.`desc`, `Language`.`sequence` FROM `languages` AS `Language` WHERE 1 = 1 ORDER BY `sequence` asc SELECT `Language`.`id`, `Language`.`iso`, `Language`.`desc`, `Language`.`sequence` FROM `pmw_languages` AS `Language` WHERE id = 1 Jakie powinny być indeksy dla tej tabeli? Czy indeksować pola po klauzuli WHERE, czy klauzula ORDER też ma znaczenie? Tzn. czy wystarczy indeks PRIMARY KEY na id, aby stwierdzić, że tabela jest poprawnie zaindeksowana? Czy należy jeszcze założyć INDEX na pole 'sequence' po którym najczęściej sortuję. To samo pytanie tyczy się pola w innej tabelce (tabela "photos") - pole `created` (datetime). Czyli data dodania rekordu. Jeśli ów tabelę sortuję najczęściej po owym "created" to czy też powinien on być uwzględniony w indeksie? Np dla najczęściej wykonywanego zapytania: SELECT `Photo`.`id` FROM `photos` AS `Photo` WHERE category_id = 1 ORDER BY `created` desc Czy poprawny indeks dla tej tabeli to sam INDEX category_id, czy INDEX złożony z dwóch pól, a mianowicie `category_id` i `created`? Z góry dziękuję za pomoc:) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 28 Pomógł: 0 Dołączył: 11.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam.
Dziękuję za rzeczową odpowiedź. Niech sprawdzę, czy dobrze zrozumiałam: nacisk przy projektowaniu indeksacji należy położyć na kolumny, po których sortujemy (ORDER), a także po tych poprzez które wyszukujemy (WHERE). Indeksy złożone z większej ilości niż 1 pole mają sens raczej wtedy, kiedy razem występują w klauzuli WHERE bądź ORDER. W innym przypadku np. na przykładzie dwa pola w WHERE, jedno w ORDER - należy założyć osobny indeks na 2 pola WHERE i osobny na pole ORDER. Natomiast jak to się ma w momencie klauzuli JOIN? Wiadomo, że pole łączące dwie tabele, powinno posiadać INDEX. Natomiast np. dla poniższego zapytania: SELECT * from photos left join users on photos.user_id=users.id where category_id=4 order by sequence Rozumiem, że należy założyć trzy osobne indeksy na pola: user_id, category_id, sequence? Jeszcze jedno pytanie: wyczytałam, iż zbyt duża ilość indeksów również negatywnie może wpływać na pracę aplikacji. Czy należy indeksować wszystkie pola, z których korzystamy w danej tabeli w WHERE i ORDER, czy np. te które są rzadko używane (np. w 2-3 funkcjach z poziomu panelu administratora, używanych o wiele rzadziej niż funkcje z front-endu) - pozostawić niezaindeksowane? Nie znalazłam w sieci wątku, który jednoznacznie określa sposób myślenia podczas projektowania indeksów w rozbudowanych aplikacjach. Może ten wątek komuś pomoże:-) Pozdrawiam, chrupka |
|
|
![]() ![]() |
![]() |
Aktualny czas: 12.10.2025 - 23:53 |