2016-12-11 6 views
0

Мое представление mysql очень медленно в тысячах данных, как мы можем улучшить эту функциональность?Вид Mysql очень медленный

При получении этого представления в данных 10000s он занимает больше 30 секунд. как мы можем пересмотреть эту таблицу представлений?

SELECT 
    i.jo_in_id, 
    j.*, 
    i.jo_in_week_number, 
    i.jo_in_client_ref_no, 
    i.cl_id AS jo_in_cl_id, 
    c.cl_short_name, 
    c.cl_business_name, 
    m.me_first_name, 
    m.me_last_name, 
    m.me_mobile, 
    sk.sk_name, 
    sk.sk_ticketed, 
    ti.ti_id, 
    ta.ta_name, 
    u.un_id, 
    u.un_from, 
    u.un_to, 
    v.ve_name, 
    mp.vmp_name, 
    r.vr_name 
FROM 
    jo_2_no j2n, 
    jo_in_numbers i, 
    jobs j 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id AND ((j.jo_time_on BETWEEN u.un_from AND u.un_to) OR (j.jo_time_on BETWEEN u.un_from AND u.un_to)) 
WHERE 
    j.jo_id = j2n.jo_id 
    AND j2n.jo_in_numbers_id = i.jo_in_id 

ПОСЛЕ пользователя EXPLAIN SELECT Ниже приведен результат

enter image description here

+0

У вас есть какие-либо индексы на столбцах соединения? Кроме этого, вы можете прекратить использование представлений, которые, как правило, медленны. –

+1

@TimBiegeleisen Просмотров не медленнее или быстрее, чем другие запросы. – arkascha

+0

Основной причиной, скорее всего, является тот факт, что вы объединяете много таблиц. Это медленно. Вы можете попытаться ускорить процесс с соответствующими индексами, но только до сих пор. По крайней мере, попытайтесь обойти использование «comma join», используемого для первых трех таблиц, которое _really_ раздувает временную таблицу, созданную для набора результатов. Чем больше этот набор, тем медленнее запрос. Но в конечном итоге вы должны переконфигурировать свою базу данных, чтобы упростить запросы (представления) – arkascha

ответ

0

в вашем EXPLAIN, я вижу, что ваши соединенные таблицы ti и u считываются со столом-сканов (тип: ALL). Это, вероятно, самая большая проблема для вашей работы.

Вы должны убедиться, что вы создали следующие показатели:

ALTER TABLE crew_tickets ADD KEY (sk_id, me_id, ti_expire); 

ALTER TABLE unavailability ADD KEY (me_id, un_from, un_to); 

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

Кроме того, не используйте устаревшие «запятые». Особенно не смешивайте оба стиля. Это укусит вас, когда вы будете удивлены порядком приоритета между запятыми и операторами JOIN. См. Примеры в Can someone help explain why not using a SQL JOIN is bad practice and wrong? или Error on JOIN mysql.

Написать свой присоединяется так:

FROM jo_2_no j2n 
INNER JOIN jo_in_numbers i ON j2n.jo_in_numbers_id = i.jo_in_id 
INNER JOIN jobs j ON j.jo_id = j2n.jo_id 
LEFT JOIN venues_new v ON j.ve_id = v.ve_id 
LEFT JOIN venues_meeting_place mp ON j.vmp_id = mp.vmp_id 
LEFT JOIN venues_rooms r ON j.vr_id = r.vr_id 
LEFT JOIN clients c ON j.cl_id = c.cl_id 
LEFT JOIN members m ON j.me_id = m.me_id 
LEFT JOIN skills sk ON j.sk_id = sk.sk_id 
LEFT JOIN tasks ta ON j.ta_id = ta.ta_id 
LEFT JOIN crew_tickets ti ON j.sk_id = ti.sk_id 
    AND j.me_id = ti.me_id AND j.jo_time_off < ti.ti_expire 
LEFT JOIN unavailability u ON j.me_id = u.me_id 
    AND j.jo_time_on BETWEEN u.un_from AND u.un_to 

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

+0

Спасибо, Билл это сработало для меня. –

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