Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] SELECT, INNER JOIN i wydajność
Forum PHP.pl > Forum > Bazy danych > MySQL
eai
Witam.

Mamy dwie tabele. W jednej przechowywuje użytkowników w drugiej wiadomości. Pobranie tematów wiadomości wraz z loginami osób mogę zrobić na dwa sposoby:

  1. SELECT m.title, u.login FROM mailbox AS m, users AS u WHERE m.users_id = u.id


  1. SELECT m.title, u.login FROM mailbox AS m INNER JOIN users AS u ON (m.users_id = u.id)


Oba zapytania zwrócą ten sam wynik. Które z tych zapytań jest bardziej wydajne i mniej obciąża bazę danych.
Używam osobiście framework Zend Framework, i korzystam z Zend_Db_Select. Korzystając z tego obiektu stworzenie pierwszego zapytania SQL nie jest możliwe. Może producenci ZF mieli w tym jakiś cel? Bardzo proszę o wyjaśnienie mi różnic tych dwóch zapytań.
erix
A znasz
  1. EXPLAIN
? snitch.gif
eai
  1. SELECT m.title, u.login FROM mailbox AS m, users AS u WHERE m.users_id = u.id

Kod
+------------------------------------------+--------+
| title                                    | login  |
+------------------------------------------+--------+
| dodał Cię do swojej listy przyjaciół     | admin  |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | bombel |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | ziomal |
+------------------------------------------+--------+
6 rows in set (0,00 sec)

  1. EXPLAIN (SELECT m.title, u.login FROM mailbox AS m, users AS u WHERE m.users_id = u.id)

Kod
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                     | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
|  1 | SIMPLE      | m     | ALL    | NULL          | NULL    | NULL    | NULL                    |   13 |       |
|  1 | SIMPLE      | u     | eq_ref | PRIMARY       | PRIMARY | 4       | 12ga-hotnite.m.users_id |    1 |       |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
2 rows in set (0,00 sec)


  1. SELECT m.title, u.login FROM mailbox AS m INNER JOIN users AS u ON (m.users_id = u.id)

Kod
+------------------------------------------+--------+
| title                                    | login  |
+------------------------------------------+--------+
| dodał Cię do swojej listy przyjaciół     | admin  |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | bombel |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | hubert |
| dodał Cię do swojej listy przyjaciół     | ziomal |
+------------------------------------------+--------+
6 rows in set (0,00 sec)

  1. EXPLAIN (SELECT m.title, u.login FROM mailbox AS m INNER JOIN users AS u ON (m.users_id = u.id))

Kod
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref                     | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
|  1 | SIMPLE      | m     | ALL    | NULL          | NULL    | NULL    | NULL                    |   13 |       |
|  1 | SIMPLE      | u     | eq_ref | PRIMARY       | PRIMARY | 4       | 12ga-hotnite.m.users_id |    1 |       |
+----+-------------+-------+--------+---------------+---------+---------+-------------------------+------+-------+
2 rows in set (0,00 sec)


No i nadal nie widzę różnicy smile.gif
blooregard
A weź sobie to zapętl ileś tam tysięcy razy i zobacz, która wersja wykona się szybciej.
maly_swd
a czy to przez przypadek nie jest to samo;D
erix
Jest w dokumentacji napisane, że where tabela1.pole1=tabela2.pole1 to po prostu JOIN. [;
calebos
Cytat(eai @ 24.06.2009, 20:12:26 ) *
Korzystając z tego obiektu stworzenie pierwszego zapytania SQL nie jest możliwe. Może producenci ZF mieli w tym jakiś cel? Bardzo proszę o wyjaśnienie mi różnic tych dwóch zapytań.


Oba zapytania sa tak naprawde takie same. Prawdopodobnie Framework chce na Tobie wymusic pisanie JOIN'ow wedlug standardu. Robi sie po to ze jak jest ich juz sporo w jakiejs aplikacji to wtedy zacznie Cie irytowac odszukiwanie zlaczen tam gdzie warunki
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.