I am trying to optimize this slow query (> 2s)
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
This is the result when I use 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
It uses the index I created (dept_idx), but it takes more than 2 seconds to complete a query on a data set of 1380,384 records. Is there any other way to express this query in an optimal way?
UPDATE Using David's suggestions, the query is now reduced to a few milliseconds instead of working for more than 2 seconds (in fact, 51 seconds in MySQL version 5.0).
source share