![]() |
![]() |
![]()
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: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
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. 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 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 13.10.2025 - 16:34 |