Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pytanie o indeksację tabeli
chrupka
post
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:)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
chrupka
post
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
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: 12.10.2025 - 23:53