2012-06-29 3 views
1

Мне было интересно, как именно внутренние соединения работают в mysql.INNER JOIN Выполнение/оценка заказа

Если я

SELECT * FROM A a 
INNER JOIN B b ON a.row = b.row 
INNER JOIN C c ON c.row2 = b.row2 
WHERE name='Paul'; 

ли делать это стыки, а затем выбрать те, где имя = PAUL? Потому что, когда я делаю это так, это SUPER DUPER медленно.

есть способ сделать что-то вдоль линий:

SELECT * FROM (A a WHERE name='paul') 
INNER JOIN B b ON a.row = b.row 
INNER JOIN C c ON c.row2 = b.row2] 

Когда я пытаюсь это таким образом, я просто получаю сообщение об ошибке.

или, альтернативно, лучше просто иметь 3 отдельных запроса, один для A, B и C? пример:

string query1 = "SELECT * FROM A WHERE name = 'paul'"; 
//send query, get data reader 
string query2 = "SELECT * FROM b WHERE b = " + query1.b; 
//send query, get data reader 
string query3 = "SELECT * FROM C WHERE c = " + query1.c; 
//send query, get data reader 

Очевидно, что это всего лишь псевдокод, но я думаю, что это иллюстрирует точку.

Какой способ ускорен/рекомендуется?

Редактировать Структура таблицы:

**tblTimesheet** 
int timesheetID (primary key) 
datetime date 
varchar username 
int projectID 
string description 
float hours 

**tblProjects** 
int projectID (primary key) 
string project name 
int clientID 

**tblClients** 
int clientID 
string clientName 

The join that I want is: 

select * from tblTimesheet time 
INNER JOIN tblProject proj on time.projectID = proj.projectID 
INNER JOIN tblClient client on proj.clientID = client.clientID 
WHERE username = 'paul'; 

что-то подобное

+0

Ваш первый запрос выглядит нормально; индексируются номера строк? –

+0

Этот вопрос также затрагивается в этом вопросе - http://stackoverflow.com/questions/228424/in-what-order-are-mysql-joins-оценен – dash

ответ

2

Вы, вероятно, отсутствует знак индекс на ключевой таблице; вы можете использовать ключевое слово MySql EXPLAIN, чтобы помочь выяснить, где ваш запрос медленный.

Чтобы ответить на другой раздел вашего вопроса;

is there a way to do something along the lines: 

SELECT * FROM (A a WHERE name='paul') 
INNER JOIN B b ON a.row = b.row 
INNER JOIN C c ON c.row2 = b.row2] 

Вы можете использовать SubQuery;

SELECT * 
FROM (SELECT * FROM tblTimesheet WHERE username = 'Paul') AS time 
INNER JOIN tblProject proj on time.projectID = proj.projectID 
INNER JOIN tblClient client on proj.clientID = client.clientID 

Этот эффективный процесс заключается в том, чтобы предварительно очистить поля, на которых будет работать JOIN. Вместо того, чтобы объединять все поля вместе, а затем отфильтровывать их, он только пытается вставить поля JOIN из tblTimesheet, где сначала имя «Пол».

Однако оптимизатор запросов должен уже делать это, чтобы этот запрос выполнялся аналогично исходному запросу.

Для получения дополнительной помощи с индексами, понимание которых поможет вам значительно в разработке баз данных, начнем с рассмотрения учебника как this one.

2

Это сказочно вряд ли объединение будет происходить медленнее, чем три удара базы данных. Переупорядочение предложений не должно влиять ни на оптимизацию запросов MySQL. Являются ли столбцы в индексах WHERE/ON индексированными?

+0

Я не думал, что путь будет быстрее ... Просто подумал, что я спрошу. Что вы подразумеваете под индексированием? – Toadums

+0

@Toadums Если индексируется столбец, это означает, что вы хотите потратить некоторое дисковое пространство/память и процессорное время, вставив в него значение, чтобы сделать поиск намного быстрее. Вы должны добавить индекс для каждого столбца, который вы собираетесь использовать для поиска строк. Я также рекомендую подкачку через учебник по вводным базам данных. – millimoose

2

Я думаю, вы найдете, что оптимизатор запросов даст вам самый лучший запрос большую часть времени. Вам нужно посмотреть план выполнения, чтобы выяснить, почему запрос медленный - я думаю, это отсутствие индексов.

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

Индекс гарантирует, что движок не нуждается в поиске вниз до уровня страницы листа и, как правило, ускоряют запросы

Что такое структура таблицы здесь или все это гипотетически?

Общее эмпирическое правило с SQL - попробуйте и посмотрите!

+0

Я обновил свой вопрос, показывая структуру таблицы. Все говорили использовать индексы, как бы я это сделал с моим примером? благодаря! – Toadums

+1

ALTER TABLE TableName ADD INDEX IndexName (FieldName) – Jeff

+0

@Jeff Хорошо, кажется легким! Так я бы хотел, чтобы индекс на имя пользователя? (Я предполагаю, что первичный ключ еще быстрее, чем индекс?) – Toadums

1

Используйте свой первый запрос, оптимизатор запросов MySQL должен выбрать самую быструю стратегию

, если вы хотите, чтобы это было быстрее, убедитесь, что есть индекс на name колонке