2011-07-28 12 views
8

Używam tabeli podzielonej na partycje z dużą ilością danych. Zgodnie z docs MySQL, jest na liście ToDo że:Czy MySQL może zrównoleglić podzapytania UNION (lub cokolwiek w ogóle)?

Zapytania obejmujące łączne funkcje, takie jak SUM() i COUNT() może być łatwo parallelized.

... ale czy mogę osiągnąć tę samą funkcjonalność przy użyciu podzapytań UNION? Czy są one zrównoleglone, czy też muszę utworzyć klienta wielowątkowego, aby uruchamiać zapytania współbieżne ze wszystkimi możliwymi kluczami partycji?


Edit:

Pytanie nie jest ściśle o Unii lub podzapytania. Chciałbym wykorzystać jak najwięcej rdzeni dla moich zapytań. Czy jest jakiś sposób, aby to zrobić (i upewnić się, że jest to zrobione) bez sparowania mojej aplikacji?

Dobra dokumentacja dotycząca bieżących możliwości równoległego MySQL?

+0

masz na myśli ' wybierz a.sum, b.count z (select sum (x) jako sumę XXX) jako (select count (*) jako Hrabia XXX) jak b ' instt of ' wybierz sumę (x) jako sumę, policz (*) jako liczbę z xxx ' –

+0

@Luis Nie mówię o funkcjach zagregowanych tylko.Ale jeśli tak, to coś takiego: SELECT AVG (numer) FROM table WHERE class = 1 UNION SELECT AVG (number) FROM table WHERE class = 2' – vbence

Odpowiedz

4

O ile mi wiadomo, obecnie jedynym sposobem, aby używać więcej niż jeden wątek/rdzeń do uruchamiania zapytań w aplikacji, to użycie więcej niż jednego połączenia. To oczywiście uniemożliwia uruchamianie równoległych zapytań, które są częścią pojedynczej transakcji.

+0

Dzięki! Dbam tylko o szybkość moich SELECT, więc transakcje nie są tak naprawdę problemem. – vbence

+2

W PHP mogłem używać http://www.php.net/manual/en/mysqli.reap-async-query.php w celu równoległego uruchamiania 4 zapytań na 4 rdzeniowym serwerze. – Mchl

1

Różne zapytania, które są UNIONED razem w jednym większym zapytaniu, nie są tak naprawdę podzapytaniami, ściśle mówiąc.

  • zapytań są prowadzone w celu
  • Typ danych kolumny jest określona przez pierwsze zapytania
  • Domyślnie identyczne wiersze są usuwane (domyślnie Unię do DISTINCT)
  • Zestaw wynik nie zostało ukończone, dopóki wszystkie zapytania nie zostaną uruchomione, dopóki nie zostaną uruchomione wszystkie zapytania:

... nie ma możliwości zrównoleglenia różnych zapytań, ponieważ wszystkie one są częścią tego samego zapytania.

Możesz spróbować uruchomić różne zapytania równolegle z kodem, a następnie zsumować wyniki razem w kodzie po zakończeniu wszystkich zapytań.

Dokumentacja na UNION można znaleźć here.

+0

Ani fakt, że 'DISTINCT' jest wartością domyślną, ani że typy wierszy musi być znany przed wysłaniem wyniku, zakazać równoległego przetwarzania. Z połączonego dokumentu: * Jednak użycie ORDER BY dla poszczególnych instrukcji SELECT nie implikuje niczego w porządku, w którym wiersze pojawiają się w wyniku końcowym, ponieważ UNION domyślnie tworzy nieuporządkowany zestaw wierszy. * – vbence

+0

ORDER BY dla poszczególnych SELECT, tak - ale bez dodawania nawiasów, ORDER BY na końcu tego zestawu zapytań spowoduje uporządkowanie całego zestawu wyników. – TehShrike

+0

Zauważ, że lista, którą podałem powyżej, niekoniecznie jest listą powodów, dla których niektóre równoległości nigdy nie mogłyby się zdarzyć, ale wszystkie są związane z interakcją między różnymi częściami zapytania UNIONED. – TehShrike

1

Myślę, że na podobne pytanie udzielono odpowiedzi. http://forums.mysql.com/read.php?115,84453,84453

(Może być Powinienem napisali to jako komentarz, ale szczerze mówiąc nie mogliśmy znaleźć wszędzie wokół przycisku komentarz tutaj.)

+1

Dobre znalezisko. Jeśli chcesz rozwiązać ten sam problem, co ten facet (nie chciał dzielić swoich zapytań z powodu dużego opóźnienia), zawsze możesz utworzyć procedurę składowaną, która uruchomi dla Ciebie wiele zapytań, a następnie zwróci je wszystkie jednocześnie. . – TehShrike

+2

Otrzymasz dostęp do komentowania o reputacji 50. Zobacz http://stackoverflow.com/privileges – Mchl

+1

Podobne pytanie, ale nie było satysfakcjonującej odpowiedzi. Lub była odpowiedź NIE między wierszami? Anywas, I certailny zrobił mój ** google: mysql parallel ** przed opublikowaniem pytania. – vbence

Powiązane problemy