2013-09-24 9 views
7

Mam projekt bazy danych tutaj, że wygląda to w uproszczonej wersji:PHP/MySQL: Masowe zapytanie SQL lub kilka mniejszych zapytań?

Tabela building:

  • id
  • atrybut1
  • atrybut2

danych tam jest jak:

  • (1, 1, 1)
  • (2, 1, 2)
  • (3, 5, 4)

i tabele attribute1_values i attribute2_values, strukturę:

  • id
  • wartość

który zawiera informacje takie jak:

  • (1 "tekstowy opis wariantu 1")
  • (2 "opis tekstowy opcja 2")
  • ...
  • (6 "tekstowy opis wariantu 6")

Nie jestem pewien, czy jest to najlepsza konfiguracja, czy nie, ale jest ona wykonywana zgodnie z wymaganiami mojego kierownika projektu. Z pewnością ma w tym trochę prawdy, ponieważ możesz teraz łatwo modyfikować tekst bez bałagania.

Jednak teraz doszedłem do strony, gdzie potrzebne do listy atrybutów, więc jak mogę iść o tam? Widzę dwie główne opcje:

1) Zrób jedno duże zapytanie, które zbiera wszystkie wartości z building i jednocześnie wybiera poprawną reprezentację tekstową z tabeli attribute{x}_values.

2) Zrób mały kwerendę, która gromadzi wszystkie wartości z tabeli building. Następnie otrzymasz tekstową reprezentację każdego atrybutu po jednym na raz.

Jaki jest najlepszy wariant do wyboru? Czy opcja 1 jest jeszcze szybsza w opcji 2? Jeśli tak, to czy warto mieć dodatkowe kłopoty z konserwacją?

+6

Jedno zapytanie do bazy danych jest na ogół dużo bardziej wydajny niż wielu zapytań i powinno być mniej kodu, jak również –

+0

@MarkBaker Nie może wynosić do 20 atrybutów though ... Każdy powód, aby mieć inną opinię następnie? – skiwi

+0

Im więcej atrybutów, tym więcej powodów do korzystania z pojedynczego zapytania, a nie z 20 pojedynczych zapytań - koszty czasu na wykonanie zapytania są dużo wyższe niż koszty czasu na przechwycenie zestawu wyników, więc 20 zapytań, z których każdy zwraca 1 wynik, jest prawie nieuchronnie dużo wolniej niż jedno zapytanie, które zwraca 20 wyników –

Odpowiedz

-1

Nigdy nie rób pojedynczo zapytaniami czasu, starają się je połączyć w jeden.

MySQL będzie buforować zapytanie i będzie działał znacznie szybciej. Pętle PhP są szybsze niż wykonywanie wielu żądań do bazy danych.

Pamięć podręczna przechowuje zapytania tekst SELECT wraz z odpowiednią wyniku, który został wysłany do klienta. Jeśli później zostanie odebrana identyczna instrukcja, serwer pobierze wyniki z pamięci podręcznej zapytań, zamiast analizować i ponownie wykonywać instrukcję.

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

0

Jeśli masz małą liczbę wierszy w tabeli atrybutów, to proponuję, aby sprowadzić je najpierw pobrać wszystkie z nich! zapisz je do pewnej tablicy, używając id jako klucza indeksu w tablicy.

Następnie można przystąpić do budowania danych, teraz trzeba tylko użyć odpowiedniej tablicy szukać wartości atrybutu

0

Polecam coś pomiędzy. Przetwórz wynik z pierwszej tabeli w php i sprawdź, ile atrybutów musisz wybrać z tabeli atrybutów [x] _values.

Następnie można wybrać atrybuty zbiorczo przy użyciu jednego zapytania na tabelę, zamiast jednego zapytania na atrybut lub jednego zapytania dla budynku.

1

Inną propozycją byłoby utworzenie widoku na serwerze z tylko potrzebnymi danymi i zapytanie z tego. To sprawi, że praca na serwerze skończy się, a ty będziesz mógł ciągnąć za każdym razem to, czego potrzebujesz.

+0

Co spowodowałoby, że widok różni się od zapisania go w 1 zapytaniu z punktu widzenia efektywności? –

+0

Zbieraj dane do widoku, a następnie odpytuj je, aby nie zapisywać długich zapytań pełnych złączeń za każdym razem, gdy chcesz pobrać dane. Jest bardziej wydajny niż jakikolwiek inny kod. Daje również bardziej reprezentacyjny sposób przeglądania danych w bazie danych, ponieważ znajduje się w wielu tabelach. Nie mogę sobie wyobrazić, dlaczego nie chciałbyś mieć widoku, chyba że masz na myśli czynnik, którego nie rozważam. – dsimer

0

Oto rozwiązanie PHP:

$query = "SELECT * FROM building"; 
$result = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute1_values"; 
$result2 = mysqli_query(connection,$query); 
$query = "SELECT * FROM attribute2_values"; 
$result3 = mysqli_query(connection,$query); 
$n = mysqli_num_rows($result); 
for($i = 1; $n <= $i; $i++) { 
    $row = mysqli_fetch_array($result); 
    mysqli_data_seek($result2,$row['attribute1']-1); 
    $row2 = mysqli_fetch_array($result2); 
    $row2['value'] //Use this as the value for attribute one of this object. 
    mysqli_data_seek($result3,$row['attribute2']-1); 
    $row3 = mysqli_fetch_array($result3); 
    $row3['value'] //Use this as the value for attribute one of this object. 
} 

Należy pamiętać, że takie rozwiązanie wymaga, aby attribute1_values ​​tabele i attribute2_values ​​zaczynają się od 1 i wzrost o 1 każdego wiersza.

0

Oracle/PostgreSQL/MySQL DBA tutaj:

Uruchamianie zapytania wielokrotnie ma sporo napowietrznych. Istnieje wiele podróży w obie strony do bazy danych, a jeśli jest na serwerze zdalnym, może to być sumą. DB będzie prawdopodobnie musiał wielokrotnie analizować to samo zapytanie w MySql, co będzie strasznie nieefektywne, jeśli istnieje mnóstwo wierszy. Jedna rzecz, którą ma twoja metoda PHP (wiele zapytań) ma tę zaletę, że zużywa mniej pamięci, ponieważ spowoduje zwolnienie wyników, ponieważ nie są już potrzebne (jeśli uruchomisz zapytanie jako zagnieżdżoną pętlę, , ale jeśli prześlesz wszystkie wyniki z góry, będziesz mieć dużo narzutów pamięci, w zależności od rozmiarów tabel).

Optymalnym rezultatem byłoby uruchomienie go jako 1 kwerendę i pobranie wyników 1 na raz, wyświetlanie każdego z nich w razie potrzeby i odrzucenie go, co może spustoszyć spustoszenie w frameworkach MVC, chyba że albo dobrze działa kod modelu w widoku lub uruchom małe fragmenty widoku.

0

Twoje pytanie jest bardzo ogólne i myślę, że aby uzyskać odpowiedź, powinieneś podać więcej wskazówek, jak ta strona będzie wyglądać i jak duży jest zbiór danych. Otrzymasz wszystkie budynki z ich atrybutami lub tylko jedną na czas? Powoduje to, że struktura danych wygląda bardzo prosto, a wszystko inne niż raspberrypi może sobie z tym poradzić.

Jeśli potrzebujesz jednej płyty na raz, nie potrzebujesz żadnej specjalnej techniki, po prostu DOŁĄCZ do tabel. Jeśli chcesz wyświetlić listę wszystkich budynków i chcesz zaoszczędzić czas bazy danych, musisz zmierzyć swoje dane. Jeśli masz więcej atrybutów niż budynków, musisz wybrać jeden sposób, jeśli masz 8 atrybutów i 2000 budynków, możesz pomyśleć o buforowaniu atrybutów w tablicy z wyborem dla każdej tabeli, a następnie wydrukować je przy użyciu tablicy. Nie sądzę, aby zauważyłeś spadek prędkości lub poprawę dzięki tak prostym tabelom na nowoczesnym komputerze.

$att1[1]='description1' 
$att1[2]='description2' 
....