Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja zapytania
Forum PHP.pl > Forum > PHP
endryu87
Kiedyś trzeba zarejestrować się na forum języka, który stanowi moją poniekąd pracę;)

A teraz do tematu: Czysto teoretycznie - chciałbym liznąć "przykładowej" optymalizacji zapytania sql'owego:

Zapytanie ma treść:

Kod
SELECT id_news, title_, content_, photo_, date_ FROM db_news AS t1 LEFT JOIN db_news_cat AS t2 ON t2.id_news_cat WHERE t1.id_news_cat=t2.id_news_cat AND t2.various_='$page' AND id_news='$id' AND published_=1 LIMIT 1


Generalnie: pobieram wartości z tabeli z rekordami dotyczącymi newsów, artykułów (...nieważne zresztą). Jednocześnie sprawdzam zależność, czy przekazane parametry dotyczące id oraz działu (various_). Jeśli bezpośrednio nastąpi zmiana w adresie i id rekordu będzie odwoływało się do treści należącej do innego artykułu - rekord oczywiście nie zostanie wyświetlony - jako że nie ten dział.

Myślę, że w miarę składnie wytłumaczone - i teraz pytanie z początku: czy takie zapytanie da się jakkolwiek skrócić (zoptymalizować?).

Dziękuję za pouczenie i pozdrawiam.
erix
Cytat
czy takie zapytanie da się jakkolwiek skrócić (zoptymalizować?).

To nie są określenia synonimiczne. Dłuższe zapytanie (w zapisie) wcale nie oznacza, że jest nieoptymalne. A z tego, co widze, to jest ok pod warunkiem, że masz pozakładane odpowiednie indeksy w bazie. winksmiley.jpg
TomASS
Daj sobie EXPLAIN'a

  1. EXPLAIN SELECT * FROM tabela


Będziesz miał czarno na białym czy korzysta z jakichkolwiek indeksów.
Fifi209
Każde pole możesz umieścić w ` `
np. `id`

A czemu? Bo tak jest szybciej. (np. Postgresql nie ma `)
Zyx
Odwrócone apostrofy to nie są żadne magiczne przyspieszacze, tylko informacja dla parsera, żeby przypadkiem nie zinterpretował nazwy pola jako słowa kluczowego. PostgreSQL w tej roli używa cudzysłowów. Natomiast czy to działa szybciej - może, ale nie musi. Należy zapytać twórców parsera.
Mephistofeles
Wydaję mi się, że jednak będzie szybciej - bo parser nie musi sprawdzać czy aby to słowo nie jest kluczem.
Kocurro
Zmiana na szybko:

Kod
SELECT `t1`.`id_news`, `t1`.`title_`, `t1`.`content_`, `t1`.`photo_`, `t1`.`date_` FROM `db_news` AS `t1` LEFT JOIN `db_news_cat AS `t2` ON `t1`.`id_news_cat`=`t2`.`id_news_cat` WHERE `t2`.`various_`='$page' AND `t1`.`id_news`='$id' AND `t1`.`published_`=1 LIMIT 1;


Ale przede wszystkim używaj EXPLAINA i kombinuj, niestety różne wersje bazy różnie parsują i może się okazać, że konstrukcja która na jednej wersji jest wolniejsza na innej jest szybsza.

pozdr.
Łukasz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.