2014-12-23 3 views
0

Я чрезвычайно новичок в 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 
    ) 
) 

Мне любопытно относительные последствия и достоинства (если они есть) этих методов. Например, объединение трех таблиц только для того, чтобы сделать поиск, похоже, побеждает в том, чтобы держать их в отдельных таблицах, но, наоборот, я не уверен в мудрости вложенных выборок. Я также не совсем уверен, что происходит в фоновом режиме с первым делом.

+1

версия А с помощью старого стандарта для синтаксиса объединений. Совершенно верно и СЛЕДУЕТ привести к той же производительности, что и вариант B, который использует новый стандарт. Вариант C, безусловно, является наихудшим по производительности. Сначала система должна материализовать два подбора для получения желаемых результатов. Кроме того, если вам нужна информация от tblB или tblC, опция C не будет работать. Это не «JOIN» – xQbert

ответ

1

Используйте вторую форму. Это самый распространенный и наиболее читаемый из трех.

  • Скорее всего, MySQL может сделать первую форму той же, что и вторая. Проверьте план выполнения. Любой, как это, его непросто читать, поскольку отношения между тремя таблицами не сразу очевидны.
  • Третья форма намного сложнее оптимизировать, особенно при использовании большего количества таблиц. Избегай это.
+0

Спасибо! Правильно ли я полагаю, что причиной использования подтабликов являются требования к хранилищу и производительность? Если я действительно присоединяюсь к каждой таблице в своей системе (по какой-то причине), я побеждаю в том, что у меня несколько таблиц, так как я эффективно создаю один массивный? – aqua

+1

Это очень похоже на личный стиль кодирования, когда дело доходит до использования подтабликов. Но когда вы слишком глубоко вставляете его, его гораздо труднее читать и оптимизировать (кодирование - это как компьютер, так и разработчик, который будет его поддерживать). Существует теоретически законная причина объединять каждую таблицу в вашей базе данных - это само определение реляционных данных. Вы разбиваете данные на маленькие, связанные части, чтобы впоследствии их можно было собрать вместе. –

0

Предостережение: не моя область знаний, и это не прямой ответ на ваш вопрос. Тем не менее, вам может быть полезно проверить опцию трассировки оптимизатора MySQL, так как он должен пролить свет на то, что оптимизатор запросов делает с вашим SQL, и как это происходит, фактически выполняя его. Соответствующие ссылки:

http://dev.mysql.com/doc/internals/en/optimizer-tracing.html - (официальный оракул документация) http://jorgenloland.blogspot.com/2011/10/optimizer-tracing-query-execution-plan.html - (примечания по использованию и продукции и что это значит, от оптимизатора разработчика)

Смежные вопросы