2016-07-12 1 views
1

У меня довольно сложный SQL-запрос, и я не знаю, как сделать это менее сложным. Если я пытаюсь запустить его, он перегружает db. Если я немного упрощу его, я смогу выполнить его, но это займет много времени. Я уверен, что есть гораздо более эффективные способы написания этого запроса, но я понятия не имею, как это сделать. Был бы очень рад, если бы кто-то мог вести меня в правильном направлении!MySQL Query с тремя неиндексированными унифицированными таблицами и перегруженными левыми DB

SELECT master.C_MASTER_ID, 
     master.C_MASTER_SUMMARY, 
     master.C_MASTER_START, 
     master.C_MASTER_END, 
     master.C_MASTER_LEVEL, 
     master.C_MASTER_SOURCE, 
     NULL AS EVT_HAS_Z, 
     master.C_MASTER_NOTES, 
     master.C_MASTER_SERVICE, 
     c2c.CER_CUSTOMER 
FROM `C_MASTER` master 
LEFT JOIN `c2customer` c2c ON c2c.CER_ID = master.C_MASTER_ID 
WHERE 
    master.C_MASTER_END >= NOW() 
    AND master.C_MASTER_START >= DATE_SUB(NOW(), INTERVAL 21 DAY) 

UNION ALL 

SELECT EVT_ID AS C_MASTER_ID, 
     EVT_SUMMARY, 
     EVT_START_DATE, 
     EVT_END_DATE, 
     NULL AS C_MASTER_LEVEL, 
     NULL AS C_MASTER_SOURCE, 
     EVT_HAS_Z, 
     NULL AS C_MASTER_NOTES, 
     NULL AS C_MASTER_SERVICE, 
     NULL AS CER_CUSTOMER 
FROM C_event 
WHERE EVT_end_date >= NOW() 

UNION ALL 

SELECT 'WHISPER' AS C_MASTER_CHANGE_ID, 
     WISP_SUMMARY, 
     WISP_START_DATE, 
     WISP_END_DATE, 
     NULL AS C_MASTER_LEVEL, 
     NULL AS C_MASTER_SOURCE, 
     NULL AS EVT_HAS_Z, 
     NULL AS C_MASTER_NOTES, 
     NULL AS C_MASTER_SERVICE, 
     NULL AS CER_CUSTOMER 
FROM C_wispering 
WHERE WISP_END_DATE >= NOW() 

Это немного упрощенная версия моего запроса, так как otherwhise было бы вряд ли для управляемым с просьбой о помощи поста.

+1

Какое количество рядов поступает из базы данных? Каковы ваши индексы? на каких полях и т. д.? – Tikkes

+0

@Tikkes примерно 6000 строк примерно. У меня только C_MASTER_ID и CER_ID проиндексированы. Я был неохотно с индексами, потому что я просто не знаю много об этом. Есть ли недостатки, чтобы индексировать больше полей? – sardine

+0

В этом случае вам стоит подумать о чтении индексов. Документация SQL обширна по этому вопросу и может быть чрезвычайно полезна при работе с более сложными базами данных. Индексы могут быть очень хорошими при правильном использовании и повышении производительности на тонну. Конечно, при индексировании чего-либо или всего есть недостатки, поэтому вы должны ставить индексы на часто задаваемые или часто используемые в поисковых запросах поля, а также комбинированные индексы могут использоваться в вашу пользу большую часть времени. [Документация по индексам] (https://msdn.microsoft.com/en-us/library/ms175049.aspx) – Tikkes

ответ

2

Вы должны запускать каждый запрос отдельно, чтобы определить, что вызывает проблемы с производительностью. Вы также можете посмотреть «объяснить», чтобы увидеть планы.

Вне поля зрения, я могу сказать, что первый запрос выиграет от индексов на c_master(C_MASTER_START, C_MASTER_ID) и c2customer(CER_ID, CER_CUSTOMER).

Второе извлекло бы выигрыш от индекса на C_event(EVT_end_date). И третий: C_wispering(WISP_END_DATE).

+0

Сидэтот к этому, хотя при установке индекса в datetime может быть разумным рассматривать не включая милисекунды/секунды/минуты и стремиться к часам вместо этого, чтобы уменьшить нагрузку. Более подробную информацию о производительности можно найти также в [этом вопросе stackoverflow] (http://stackoverflow.com/questions/17381875/how-to-improve-performance-for-datetime-filtering-in-sql-server) – Tikkes

+0

Спасибо очень много для ответа !! До сих пор я только индексировал CER_ID и C_MASTER_ID. Я неохотно отношусь к индексам просто потому, что не знаю много об этом:/- будут ли какие-либо недостатки, чтобы индексировать больше полей, какие-либо риски при индексировании полей, которые вы предложили, или я могу просто индексировать их?(У меня есть ежедневный процесс записи в БД, который до сих пор не был затронут, когда я проиндексировал C_MASTER_ID и CER_ID, но я боюсь, что это замедлит много, если я буду индексировать больше) – sardine

+1

@tikkes С уважением, DATETIME индекс, безусловно, лучший способ справиться с такими вещами. Принятый ответ по предоставленной вами ссылке содержит некоторую серьезную дезинформацию о сложности индексации даты и времени. –