SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 05.10.2010 23:10:54

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

Оптимизация запроса не несколькими JOIN LEFT и LIMIT

Добрый вечер, господа!

Помогите, пожалуйста, с оптимизацией запроса.

Мне кажется это довольно простой запрос, но выполняется подозрительно долго (около 4-5 секунд).

В таблице tableA порядка 100 000 записей.
В таблице tableB поярдка 250 000 записей (tableA -> tableB - один ко многим).
В таблице tableС порядка 50 записей (tableB -> tableC - один ко дному, словарь).
В таблице tableD порядка 2 000 000 записей (tableB -> tableD, один ко многим).

Тип таблиц InnoDB


SELECT
   *
FROM
   (
      SELECT * FROM tableA LIMIT 100
   ) AS a
LEFT JOIN tableB AS b ON b.a_id = a.a_id
LEFT JOIN tableC AS c ON c.c_id = b.c_id
LEFT JOIN tableD AS d ON d.b_id = b.b_id
 


Информация EXPLAIN SELECT такая:

id: 1
select_type: PRIMARY
table: <derived2>
type: ALL
possible_key: (null)
key: (null)   
key_len: (null)
ref: (null)
rows: 100
extra: пусто

id: 1
select_type: PRIMARY
table: tableB
type: ref
possible_key: FK_tableB_tableA_a_id
key: FK_tableB_tableA_a_id   
key_len: 5
ref: a.a_id
rows: 1
extra: пусто   

id: 1
select_type: PRIMARY
table: tableC
type: eq_ref
possible_key: PRIMARY, UK_tableC_c_id
key: PRIMARY   
key_len: 1
ref: b.c_id
rows: 1
extra: пусто   

id: 1
select_type: PRIMARY
table: tableD
type: ref
possible_key: FK_tableD_tableB_b_id
key: FK_tableD_tableB_b_id   
key_len: 9
ref: b.b_id
rows: 3
extra: using index

id: 2
select_type: PRIMARY
table: tableA
type: ALL
possible_key: (null)
key: (null)
key_len: (null)
ref: (null)
rows: 119543   
extra: пусто

Меня смущает последняя запись с id = 2 и rows = 119543. Это так и должно быть?

А задача такая:
Для 100 первых записей (tableA) загрузить информацию из всех остальных таблиц.

Отредактированно SpaceIQ (05.10.2010 23:12:14)

Неактивен

 

#2 06.10.2010 00:23:32

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

Re: Оптимизация запроса не несколькими JOIN LEFT и LIMIT

Небольшое изменение запроса, стало быстрее, но все равно помощь требуется:

SELECT
*
FROM
(
SELECT * FROM tableA ORDER BY a_id LIMIT 100
) AS a
LEFT JOIN tableB AS b ON b.a_id = a.a_id
LEFT JOIN tableC AS c ON c.c_id = b.c_id
LEFT JOIN tableD AS d ON d.b_id = b.b_id

Неактивен

 

#3 06.10.2010 13:35:55

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Оптимизация запроса не несколькими JOIN LEFT и LIMIT

Добрый день. Не мог бы ты показать структуру таблиц, в частности интересна структура tableA.

Неактивен

 

#4 06.10.2010 13:46:26

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Оптимизация запроса не несколькими JOIN LEFT и LIMIT

Извините, что на "ты".

Неактивен

 

#5 06.10.2010 14:07:37

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: Оптимизация запроса не несколькими JOIN LEFT и LIMIT

попробуйте так переписать:


SELECT
*
FROM
(
SELECT a_id FROM tableA ORDER BY a_id LIMIT 100
) AS a
INNER JOIN tableA AS a2 ON a2.a_id = a.a_id
LEFT JOIN tableB AS b ON b.a_id = a.a_id
LEFT JOIN tableC AS c ON c.c_id = b.c_id
LEFT JOIN tableD AS d ON d.b_id = b.b_id
 

Неактивен

 

Board footer

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