Я чрезвычайно новичок в SQL, и я пытаюсь выяснить «лучший способ» для выбора, когда задействованы несколько таблиц. К сожалению, мой набор данных довольно мал (тем самым делая этот вопрос довольно академичным), поэтому все возвращается в том же объеме времени независимо.Производительность операторов выбора нескольких таблиц
У меня есть следующие таблицы (но с меньшим количеством абстрактных имен данных):
mysql> describe tblA
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| A_data | varchar(20) | YES | | null | |
| B_ID | bigint(20) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblB
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| B_data | varchar(20) | YES | | null | |
| C_ID | bigint(20) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+----------------+
mysql> describe tblC
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| ID | bigint(20) | NO | PRI | NULL | auto_increment |
| C_data | varchar(20) | YES | | null | |
+----------------+-------------+------+-----+---------+----------------+
Там, кажется, три способа, что я могу организовать запрос, чтобы получить A_data данные конкретное значение C_data:
SELECT A_data FROM tblA,tblB,tblC
WHERE (tblC.C_data=searchKey AND tblB.C_ID=tblC.ID AND tblA.B_ID=tblB.ID)
или
SELECT A_data FROM tblA
INNER JOIN tblB ON tblA.tblB_ID=tblB.ID
INNER JOIN tblC ON tblB.tblC_ID=tblC.ID
WHERE tblC.C_data=searchKey
или
SELECT A_data FROM tblA
WHERE tblB_ID IN (
SELECT ID FROM tblB WHERE tblC_ID IN (
SELECT ID FROM tblC WHERE tblC_data=searchKey
)
)
Мне любопытно относительные последствия и достоинства (если они есть) этих методов. Например, объединение трех таблиц только для того, чтобы сделать поиск, похоже, побеждает в том, чтобы держать их в отдельных таблицах, но, наоборот, я не уверен в мудрости вложенных выборок. Я также не совсем уверен, что происходит в фоновом режиме с первым делом.
версия А с помощью старого стандарта для синтаксиса объединений. Совершенно верно и СЛЕДУЕТ привести к той же производительности, что и вариант B, который использует новый стандарт. Вариант C, безусловно, является наихудшим по производительности. Сначала система должна материализовать два подбора для получения желаемых результатов. Кроме того, если вам нужна информация от tblB или tblC, опция C не будет работать. Это не «JOIN» – xQbert