2010-01-15 14 views
6
strukturę

Database:Wiele zapytań MYSQL vs. Multiple php foreach pętli

id galleryId     type  file_name  description 
1 `artists_2010-01-15_7c1ec` `image` `band602.jpg` `Red Umbrella Promo` 
2 `artists_2010-01-15_7c1ec` `image` `nov7.jpg`  `CD Release Party` 
3 `artists_2010-01-15_7c1ec` `video` `band.flv`  `Presskit` 

mam zamiar ciągnąć obrazy z jednej części aplikacji, filmów na inny itd Czy lepiej zrobić wiele mysql zapytań dla każdej sekcji tak:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image'); 

... Albo powinienem budować tablicę asocjacyjną i po prostu zapętlenie za pośrednictwem tablicy w kółko, kiedy muszę korzystać z zestawu wyników?

Dzięki za przemyślenia.

Odpowiedz

8

Zależy, co jest ważniejsze: czytelność lub wydajność. Spodziewam się, że pojedyncze zapytanie i wstępne wypełnianie macierzy PHP będzie szybsze do wykonania, ponieważ połączenia z bazami danych są drogie, ale wtedy proste zapytanie dla każdej sekcji jest znacznie bardziej czytelne.

Jeśli nie wiesz (a nie tylko masz nadzieję), dostaniesz ogromną ilość ruchu, w którym znajdę oddzielne zapytania, a następnie martwię się o optymalizację, jeśli wygląda na to, że będzie to problem. W tym momencie będą inne rzeczy, które i tak będziesz chciał zrobić, takie jak tworzenie warstwy dostępu do danych i dodawanie buforowania.

+0

Dziękuję wszystkim - ten (jeśli jest prawdziwy) ma dla mnie sens, ponieważ w każdej kategorii będzie zawsze kilka plików. Jedno zapytanie to. – jay

0

Lepiej mieć wiele zapytań. Za każdym razem, gdy uruchamiasz zapytanie, wszystkie dane są wyciągane i ładowane do pamięci. Jeśli masz 5 różnych typów, oznacza to, że każda strona tego typu ładuje 5 razy tyle danych, ile potrzebuje.

Nawet z jednym tylko na raz, prawdopodobnie będziesz chciał rozpocząć wyświetlanie stron z zapytaniami LIMIT/OFFSET dość szybko, jeśli masz więcej niż 100 lub jakkolwiek wiele możesz rozsądnie wyświetlić na jednej stronie na raz.

2

Jeśli przez "sekcje" rozumiesz oddzielne pojedyncze strony (oddzielne żądania HTTP), które użytkownicy mogą wyświetlać, sugeruję zapytanie według typu. Jeśli na stronie, na której znajdują się tylko zestawy danych obrazu, naprawdę nie trzeba na przykład pobierać zestawu danych wideo. Naprawdę nie zaoszczędzisz zbyt wiele czasu na pobieraniu wszystkiego, ponieważ i tak będziesz łączyć się z bazą danych dla każdej strony (zakładam).

Jeśli przez "sekcje" rozumiesz różne części jednej strony, a następnie pobierz wszystko natychmiast. Pozwoli to zaoszczędzić czas na kwerendy (tylko jedno zapytanie.)

Ale w zależności od wielkości zestawu danych, możesz napotkać kłopoty z PHP limit kwerendy pamięci dla wszystkiego. Możesz wtedy spróbować zwiększyć limit pamięci, ale jeśli to się nie powiedzie, prawdopodobnie będziesz musiał wrócić do zapytania typu.

Stosowanie metody kwerendy według typu przenosi część obciążenia obliczeniowego na serwer bazy danych, ponieważ żądasz tylko i pobierasz to, czego naprawdę potrzebujesz. I nie musisz pisać kodu, aby filtrować i sortować wyniki. Filtrowanie i sortowanie to coś, o czym baza danych jest ogólnie lepsza niż kod PHP. Jeśli to możliwe, włącz pamięć podręczną zapytań MySQL, która przyspieszy te zapytania o wiele bardziej niż cokolwiek, co można napisać w PHP.

1

Jeśli wszystkie dane pochodzą z jednej tabeli, wystarczy wykonać jedno zapytanie.

Zakładam, że budujesz pojedynczą stronę z sekcją na zdjęcia, sekcję dla wideo, sekcję dla muzyki itp. Wpisz zapytanie, a następnie odszukaj wyniki posortowane według typu mediów - przejrzyj wszystkie zdjęcia, a następnie wszystkie wideo , a potem cała muzyka.