I have 2 tables as below:
CREATE TABLE
ox_campaigns
(campaignid
mediumint(9) NOT NULL auto_increment,campaignname
varchar(255) NOT NULL default '',clientid
mediumint(9) NOT NULL default '0',is_deleted
tinyint(1) NOT NULL default '0',
PRIMARY KEY (campaignid
),
KEYox_campaigns_clientid
(clientid
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8CREATE TABLE
ox_clients
(clientid
mediumint(9) NOT NULL auto_increment,agencyid
mediumint(9) NOT NULL default '0',clientname
varchar(255) NOT NULL default '',is_deleted
tinyint(4) NOT NULL,
PRIMARY KEY (clientid
),
UNIQUE KEYox_clients_account_id
(account_id
),
KEYox_clients_agencyid
(agencyid
)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
One client can have many campaigns linked to it.
I have a list of campaignids with me , what I want is a list of distinct clientids for those campaigns.
The query that I am using is:
SELECT clients.*
FROM
clients clients
JOIN
campaigns campaigns ON clients.clientid = campaigns.clientid
WHERE
campaigns.is_deleted=0
AND campaignid in (2325,2395)
AND clients.is_deleted=0
GROUP BY clients.clientid
The EXPLAIN output that it gives is :
+----+-------------+-----------+--------+-------------------------------+------+--------------------------------------------------------------------------------------------------------------------
| id | select_type | table | type | possible_keys | key | key_len| ref | rows| Extra |
+----+-------------+-----------+--------+-------------------------------+--------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | campaigns | range | PRIMARY,ox_campaigns_clientid | PRIMARY | 3 | NULL | 2 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | clients | eq_ref| PRIMARY | PRIMARY | 3 | openx.campaigns.clientid | 1 | Using where
Why it is using temporary and filesorting for this query ?