To, co odpowiedziałoby na twoje pytanie, to temat DOŁĄCZ DO ROZKŁADU.
Według strony 209 książki
Możesz dekomponować złączenie, uruchamiając wiele zapytań pojedynczej tabeli zamiast łączenia wielodostępnego, a następnie wykonując połączenie w aplikacji. Na przykład zamiast tego pojedynczego zapytania:
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id
WHERE tag.tag = 'mysql';
Możesz uruchomić następujące zapytania:
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
Dlaczego, u licha, miałbyś to robić? Na pierwszy rzut oka wygląda to na marnotrawstwo, ponieważ zwiększyłeś liczbę zapytań, nie otrzymując nic w zamian. Jednak taka restrukturyzacja może w rzeczywistości dać znaczące korzyści w zakresie wydajności:
- Buforowanie może być bardziej wydajne. Wiele aplikacji buforuje „obiekty”, które są mapowane bezpośrednio na tabele. W tym przykładzie, jeśli obiekt ze znacznikiem
mysql
jest już buforowany, aplikacja pominie pierwsze zapytanie. Jeśli znajdziesz w pamięci podręcznej posty o identyfikatorze 123, 567 lub 908, możesz usunąć je z IN()
listy. Pamięć podręczna zapytań może również skorzystać z tej strategii. Jeśli tylko jedna z tabel zmienia się często, dekompozycja złączenia może zmniejszyć liczbę unieważnień pamięci podręcznej.
- Wykonywanie zapytań indywidualnie może czasem zmniejszyć rywalizację o blokadę
- Wykonanie złączeń w aplikacji ułatwia skalowanie bazy danych poprzez umieszczenie tabel na różnych serwerach.
- Same zapytania mogą być bardziej wydajne. W tym przykładzie użycie
IN()
listy zamiast łączenia pozwala MySQL sortować identyfikatory wierszy i pobierać wiersze bardziej optymalnie, niż byłoby to możliwe w przypadku łączenia.
- Możesz ograniczyć zbędny dostęp do wierszy. Wykonanie sprzężenia w aplikacji oznacza pobranie każdego wiersza tylko raz., Natomiast sprzężenie w zapytaniu jest zasadniczo denormalizacją, która może wielokrotnie uzyskiwać dostęp do tych samych danych. Z tego samego powodu taka restrukturyzacja może również zmniejszyć całkowity ruch sieciowy i zużycie pamięci.
- Do pewnego stopnia można zobaczyć tę technikę jako ręczne wdrażanie sprzężenia mieszającego zamiast algorytmu zagnieżdżonych pętli, którego MySQL używa do wykonania sprzężenia. Łączenie mieszające może być bardziej wydajne.
W rezultacie sprzężenia czynności w aplikacji mogą być bardziej wydajne, gdy buforujesz i ponownie wykorzystujesz wiele danych z wcześniejszych zapytań, rozprowadzasz dane na wiele serwerów, zamieniasz IN()
sprzężenia na listy lub sprzężenie odnosi się wielokrotnie do tej samej tabeli.
OBSERWACJA
Podoba mi się pierwszy punktor, ponieważ InnoDB jest trochę ciężki, gdy sprawdza pamięć podręczną zapytania.
Jeśli chodzi o ostatni punkt, napisałem post 11 marca 2013 r. ( Czy istnieje różnica w wykonywaniu między warunkiem JOIN a warunkiem WHERE? ), Który opisuje algorytm zagnieżdżonej pętli. Po przeczytaniu zobaczysz, jak dobry może być rozkład złączeń.
Podobnie jak w przypadku wszystkich innych punktów z książki , programiści naprawdę szukają wydajności jako dolnej linii. Niektóre polegają na zewnętrznych środkach (poza aplikacją) w celu zwiększenia wydajności, takich jak użycie szybkiego dysku, uzyskanie większej liczby procesorów / rdzeni, dostrojenie silnika pamięci i dostrojenie pliku konfiguracyjnego. Inni zapinają się i piszą lepszy kod. Niektórzy mogą uciekać się do kodowania całej analizy biznesowej w Procedurach składowanych, ale nadal nie stosują dekompozycji łączenia (zobacz Jakie argumenty przemawiają przeciwko lub za umieszczeniem logiki aplikacji w warstwie bazy danych? Wraz z innymi postami). Wszystko zależy od kultury i tolerancji każdego sklepu programisty.
Niektórzy mogą być zadowoleni z wydajności i nie dotykać kodu. Inni po prostu nie zdają sobie sprawy z wielkich korzyści, które można czerpać, jeśli spróbują dołączyć do kompozycji.
Dla programistów, którzy chcą ...
SPRÓBUJ !!!