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
phpion
post
Post #2





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




Cytat(chrupka @ 30.07.2009, 14:37:18 ) *
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ę.

Kluczowym elementem mogącym pomóc w podjęciu decyzji jest "po którym najczęściej sortuję". Jeżeli tak faktycznie jest to nadanie indeksu na tą kolumnę będzie dobrym posunięciem.

Cytat(chrupka @ 30.07.2009, 14:37:18 ) *
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`?

Wydaje mi się, że najlepszym rozwiązaniem będą w tym przypadku 2 osobne indeksy. Indeks złożony z dwóch kolumn przydałby Ci się gdybyś sortował (ORDER BY) lub filtrował (WHERE) dane po tych dwóch kolumnach (czyli np. ORDER BY category_id, created) natomiast w przypadku gdy najpierw filtrujesz dane wybierając tylko te z określonej kategorii, a dopiero potem je sortujesz lepszym rozwiązaniem okażą się 2 osobne indeksy.

W przypadku gdy najczęściej stosowałbyś sortowanie malejące dobrze by było użyć indeksu malejącego ale niestety:
Cytat
An index_col_name specification can end with ASC or DESC. These keywords are allowed for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.

Wygląda na to, że nawet w wersji 6.0 tego nie wprowadzili - a szkoda. Potraktuj to więc jako ciekawostkę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) hehe
Go to the top of the page
+Quote Post
chrupka
post
Post #3





Grupa: Zarejestrowani
Postów: 28
Pomógł: 0
Dołączył: 11.01.2007

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


SELECT `Photo`.`id` FROM `photos` AS `Photo` WHERE category_id = 1 ORDER BY `created` desc
Cytat(phpion @ 30.07.2009, 16:36:57 ) *
Wydaje mi się, że najlepszym rozwiązaniem będą w tym przypadku 2 osobne indeksy. Indeks złożony z dwóch kolumn przydałby Ci się gdybyś sortował (ORDER BY) lub filtrował (WHERE) dane po tych dwóch kolumnach (czyli np. ORDER BY category_id, created) natomiast w przypadku gdy najpierw filtrujesz dane wybierając tylko te z określonej kategorii, a dopiero potem je sortujesz lepszym rozwiązaniem okażą się 2 osobne indeksy.


Czy jesteś pewien?
Np. dla tabeli "catalogs" : id (int PRIMARY KEY), user_id (int), sequence (int)

i dla podobnego jak wyżej zapytania:
  1. SELECT Catalog.id FROM catalogs AS Catalog WHERE user_id=4 ORDER BY Catalog.sequence ASC


Stworzyłam najpierw dwa odrębne klucze: jedno na pole user_id i drugie na pole sequence
EXPLAIN tego zapytania pokazał, że SQL mógł skorzystać z klucza user_id i tylko z tego skorzystał

Stworzyłam trzeci klucz, zawierający oba te pola (user_id i sequence) i EXPLAIN pokazał, że SQL mógł skorzystać z klucza user_id oraz user_sequence. I skorzystał z user_sequence.
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: 17.10.2025 - 21:29