SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.01.2010 13:35:43

Zelion_D
Участник
Зарегистрирован: 11.01.2010
Сообщений: 4

Оптимизация вложенных запросов

Доброе время суток.
Есть 3 таблицы:

table1
ID, Date, StudyPlan_ID, Lesson_1, Lesson_1_Lecturer, Lesson_2, Lesson_2_Lecturer, ..., Lesson_8, Lesson_8_Lecturer

table2
ID, Name, Department_ID

table3
ID, Name, Department_ID

Lesson_{N} это индекс и внешний ключ для связи с таблицей table2
Lesson_{N}_Lecturer это индекс и внешний ключ для связи с таблицей table3

В таблице table1 ~200 000 записей. В таблице table2 ~500 записей, В таблице table3 ~500 записей.

Нужно вместо Lesson_{N} выбирать Name из таблицы table2. Для Lesson_{N}_Lecturer то же самое.
JOIN сделать не получается, из-за того, что в table1 есть более одного индекса, относящегося к таблицам table2 и table3. Поэтому приходится через вложенные запросы.

SELECT sh.ID,sh.Date,sh.StudyPlan_ID,
           sh.Lesson_1,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_1) AS Lesson_1_Name,
           sh.Lesson_1_Lecturer,
           (SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_1_Lecturer) AS Lesson_1_LecturerName,
           sh.Lesson_2,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_2) AS Lesson_2_Name,
           sh.Lesson_2_Lecturer,
           (SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_2_Lecturer) AS Lesson_2_LecturerName,
           sh.Lesson_3,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_3) AS Lesson_3_Name,
           sh.Lesson_3_Lecturer,
           (SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_3_Lecturer) AS Lesson_3_LecturerName,
           ...
           sh.Lesson_8,(SELECT s.Name FROM table2 AS s WHERE s.ID=sh.Lesson_8) AS Lesson_8_Name,
           sh.Lesson_8_Lecturer,
           (SELECT l.Name FROM table3 AS l WHERE l.ID=sh.Lesson_8_Lecturer) AS Lesson_8_LecturerName,
FROM   table1 AS sh
WHERE
           sh.Date >= ?StartDate AND sh.Date <= ?EndDate AND StudyPlan_ID = ?ID

Можно ли как-то оптимизировать этот запрос?

Неактивен

 

#2 11.01.2010 14:01:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Оптимизация вложенных запросов

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

Ну и названия таблиц неудачные.

Неактивен

 

#3 11.01.2010 14:15:11

Zelion_D
Участник
Зарегистрирован: 11.01.2010
Сообщений: 4

Re: Оптимизация вложенных запросов

Названия таблиц shedule, subjects, lecturers smile
table{N} - это псевдоназвания.

А можно пример, как через JOIN написать? Я не совсем понимаю.

SELECT s1.Name,s2.Name
FROM shedule AS sh
        LEFT JOIN subjects AS s1 ON s1.ID=sh.Lesson_1
        LEFT JOIN subjects AS s2 ON s2.ID=sh.Lesson_2

Так?

Неактивен

 

#4 11.01.2010 14:29:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Оптимизация вложенных запросов

Ну да, например, так.

А еще можно нормализовать первую табличку (чтобы не было этих страшных Lesson_),
и перейти на обычные внутренние JOIN. И тогда наступит мир и счастье smile

Неактивен

 

#5 11.01.2010 14:40:06

Zelion_D
Участник
Зарегистрирован: 11.01.2010
Сообщений: 4

Re: Оптимизация вложенных запросов

А что посоветуете, кроме как:
ID,Date,StudyPlan_ID,LessonNum,Lesson_Id,Lecturer_Id
   где LessonNum это {1-8}, а Lesson_Id и Lecturer_Id то же самое что и Lesson_{N} и Lesson_{N}_Lecturer

Получается, что кол-во записей в таблице увеличится в 8 раз (в худшем случае, если все 8 пар Lesson_Id и Lecturer_Id не null)

Неактивен

 

#6 11.01.2010 15:02:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Оптимизация вложенных запросов

Но записи при этом станут короче, запросы будут проще и понятнее, а
в случае появления девятой лекции, ее будет куда вписать smile

Неактивен

 

#7 11.01.2010 15:16:42

Zelion_D
Участник
Зарегистрирован: 11.01.2010
Сообщений: 4

Re: Оптимизация вложенных запросов

Да, точно! Спасибо smile Так и сделаю

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson