Temat: mySQL -pobieranie danych z wielu tabel dla jednego...
Grzegorz Drzymała:
Wydaje mi się, że opisałeś trochę inny przypadek.
Prosiłem o wytłumaczenie czym różni się
SELECT DISTINCT kol1,kol2,kol3,kol4
FROM tabela
od
SELECT kol1,kol2,kol3,kol4
FROM tabela
GROUP BY kol1,kol2,kol3,kol4
Nigdzie póki co nie było mowy o ograniczaniu zbioru poprzez WHERE. Również ten MySQLowy wynalazek, który pozwala na zawarcie w SELECT kolumn, których nie ma w GROUP BY mnie nie przekonuje...w innych RDBMSach może rodzić problemy.
Prosiłeś o wytłumaczenie, i wytłumaczyłem: w MySQL użycie
DISTINCT daje lepszy
query plan. W oryginalnym zapytaniu użyłem
WHERE, ponieważ nie chciałem preparować specjalnej tabeli do testów i tabela, na której robiłem testy ma ok. 100mln rekordów.
Wrzucam więc
query plan bez
WHERE na tej samej tabeli bez wykonania zapytań ze względu na wspomnianą liczbę rekordów(przewidywana liczba wyników dla tego zapytania to ok. 4mln):
mysql> explain select host_id, id_status from report group by host_id, id_status;
+----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
| 1 | SIMPLE | report | ALL | NULL | NULL | NULL | NULL | 27674 | Using temporary; Using filesort |
+----+-------------+--------+------+---------------+------+---------+------+-------+---------------------------------+
mysql> explain select distinct host_id, id_status from report;
+----+-------------+--------+------+---------------+------+---------+------+-------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+-------+-----------------+
| 1 | SIMPLE | report | ALL | NULL | NULL | NULL | NULL | 27674 | Using temporary |
+----+-------------+--------+------+---------------+------+---------+------+-------+-----------------+
Query plan bez
WHEREnie różni się niczym z punktu widzenia planera zapytań w MySQL, w kolumnie
Extra nie pojawia się tylko informacja
Using where. W stosunku do poprzedniego planu z wykorzystaniem
WHERE jest jeszcze jedna różnica: zapytanie nie wykorzystuje indeksów, ponieważ nie ma
WHERE i jest wykonywany
Full table scan.
Mój przykład z użyciem
WHERE zobrazował różnicę pomiędzy dwoma typami zapytań w MySQL.
Trochę rozszerzyłem przykład - dodałem dodatkowe wiersze.
Teraz liczba wierszy w tabeli to 103, a liczby unikalnych par 100.
Przykładowo w Oraclu
Zarzuciłeś mi, że opisuję inny przypadek, po czym sam opisałeś coś zupełnie innego. Pytanie dotyczyło bazy danych MySQL, a ty opisujesz różnice w wykonaniach 2 typów zapytań w Oracle. Jeżeli w Oracle oba zapytania mają taki sam koszt, to tylko plus dla Oracle.
W MySQL, którego dotyczy ten wątek jednak jest inaczej, i zwróciłem na to uwagę. Zapytanie z
GROUP BY wymaga dodatkowego sortowania tabeli tymczasowej. Więcej w dokumentacji do
EXPLAIN.
Mariusz Sucajtys edytował(a) ten post dnia 06.03.11 o godzinie 23:02