2016-02-11 34 views
0

Я это query-mysql - Как улучшить ситуацию при работе?

SELECT * FROM alerts a 
INNER JOIN alerts_account aa ON a.alert_id=aa.alert_id 
WHERE aa.account_id=638 
AND a.type IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17) 
AND CASE WHEN (type = 11 OR type = 13 OR type = 16 OR type = 17) 
THEN (is_acknowledged = 0) AND (TIMESTAMPDIFF(HOUR, time, utc_timestamp()) <= 4) 
ELSE 1=1 
END order by a.alert_id desc limit 10 

Моя таблица миллионы записей и его в TIMESTAMPDIFF(HOUR, time, utc_timestamp()), что это замедляет запрос? Это занимает более 10 секунд. Как я могу улучшить производительность в этом случае. Должен ли я использовать CASE здесь?

EDIT:

оповещения

alert_id | type | time    | details| patient_account_id 
1  | 1 | 2014-10-22 05:43:45 | 2015 | 234 
2  | 5 | 2014-10-22 06:21:23 | 2014 | 345 
3  | 12 | 2014-10-22 14:30:23 | 2016 | 456 

alert_account

alerts_account_id | alert_id |account_id| is_poped_up| is_acknowledged 
1     | 1  |234  | 0   | 0 
2     | 2  |345  | 1   | 1 
3     | 3  |456  | 1   | 1 

оповещает

alerts

alerts_account

alerts_account

+0

Удалить ваш случай, когда, в случае, когда предложение where не рекомендуется. –

+0

показывают обе схемы таблиц с индексами и предупреждениями Таблица подсчета строк с типом состояния в (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17) и число столбцов таблицы warn_account с условием account_id = 638 ... –

+0

@ ZafarMalik см. Мое редактирование – HeisenBerg

ответ

1

Сначала нужно создать индекс в соответствии с ниже и проверьте достижение максимальной эффективности

alter table alerts_account add index idx_alert_id(alert_id); 

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

Даже самый точный показатель, мы можем только после получения желаемого количества, но после просмотра вашего запроса, кажется, что в основном данные фильтруются account_id поля, так что вы можете создать окончательный индекс согласно

цен ниже
alter table alerts_account add index idx_alert_id(alert_id), add index idx_account_id(account_id); 
+0

Нет, индекс требуется в таблице alert_account, как я упоминал в своем ответе. –

+0

Простите, на мгновение. Я перепутал имена. Я удалил свой комментарий. Я попробую и вернусь к вам. – HeisenBerg

+0

жаль, что я забыл принять ваш ответ ... спасибо большое товарищу – HeisenBerg

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