Wpis z mikrobloga

Pytanie: czy wykonując zapytanie

SELECT a.x, b.y

FROM a

JOIN b ON a.klucz=b.klucz

WHERE a.warunek=1

najpierw jest robiony

JOIN
, a dopiero potem filtrowanie względem pola

a.warunek
czy może na odwrót - najpierw filtrowana jest tabela

a
, a dopiero na podstawie otrzymanych wyników wykonywany jest

JOIN
? Co w przypadku, gdybym zmienił filtr na

b.warunek=1
?

#kiciochpyta #komputery #bazydanych #mysql #innodb
  • 18
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@lo0kash: no właśnie to wcale nie jest takie pewne (szczególnie w sytuacji, gdy pojawi się wiele warunków dla różnych tabel).

@TzK: chyba nie, ale można zrobić zapytanie w zapytaniu, np.

SELECT * FROM a WHERE warunek=1
  • Odpowiedz
@TzK: To jest kolejność logiczna, ważna jest tylko przy parsowaniu zapytania. To jak się naprawdę to wykonuje to już inna para kaloszy.
  • Odpowiedz
@rss: @jubal

EXPLAIN EXTENDED pokaze Ci dokladnie jak wyglada zapytanie po przejsciu przez optymalizatora.Tak wiec to co sobie napiszesz to jedno, a to co zrobi z tego optymalizator to
  • Odpowiedz
@rss: mySQL do wersji 5.6 przetwarza zapytania zawsze zgodnie z algorytmem zagnieżdżonych pętli (Nested Loops). Inne bazy, np. Oracle mogą wybrać ścieżkę Sort-Merge, czyli najpierw sort filtrujący na tabelach łączonych, następnie łączenie po wyliczonym hashu. Ta druga jest zwykle bardziej efektywna dla przetwarzania dużych ilości danych jeśli jesteś zainteresowany wykonaniem całości w jak najkrótszym czasie.

Tu masz opis jak działa nested loops krok po kroku http://dev.mysql.com/doc/refman/5.6/en/nested-loop-joins.html, możesz się dowiedzieć jak
  • Odpowiedz