Я пытаюсь оптимизировать этот медленный запрос (> 2с)Оптимизация SQL-запрос
SELECT COUNT(*)
FROM crmentity c, mdcalls_trans_activity_update mtu, mdcalls_trans mt
WHERE (mtu.dept = 'GUN' OR mtu.dept = 'gun') AND
mtu.trans_code = mt.trans_code AND
mt.activityid = c.crmid AND
MONTH(mtu.ts) = 2 AND
YEAR(mtu.ts) = YEAR(NOW()) AND
c.deleted = 0 AND
c.smownerid = 28
Это выход, когда я использую EXPLAIN:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE c index_merge PRIMARY,crmentity_smownerid_idx,crmentity_deleted_smownerid_idx,crmentity_smownerid_deleted_idx crmentity_smownerid_idx,crmentity_deleted_smownerid_idx 4,8 NULL 91 Using intersect(crmentity_smownerid_idx,crmentity_deleted_smownerid_idx); Using where; Using index
1 SIMPLE mt ref activityid activityid 4 pharex.c.crmid 60
1 SIMPLE mtu ref dept_idx dept_idx 5 const 1530 Using where
Она использует индекс, который я создал (dept_idx), но для выполнения запроса по сравнению с набором данных из 1380384 записей требуется еще более 2 секунд. Есть ли другой способ выразить этот запрос оптимальным образом?
UPDATE: Используя предложения Дэвида, запрос теперь сокращается до нескольких миллисекунд вместо того, чтобы работать более 2 секунд (на самом деле, 51 секунда в версии 5.0 от MySQL).
Я бы написал 'WHERE lower (mtu.dept) = 'gun' AND ...', но я предполагаю, что ваша БД уже будет оптимизировать его таким образом. – initall
Я нашел, по крайней мере, в Oracle, используя более низкое значение в запросах, вызванных массовым замедлением. Является ли это причиной более медленного, чем сравнение дополнительных строк ... –
Использование lower() в столбце - хороший способ НЕ использовать любые индексы. Это объясняет ваше замедление. –