I have a query that runs very slow and using Using temporary; Using
filesort. Is there a way to avoid them using current table structure?
Goal with the query is to find ads (ad_id) that have tags (tag_id) connected
to them, order by "antal" is used to get the most relevant first. ( the one
that conains all 5 tags and so on).

Query:

SELECT COUNT(*) antal,ad.ad_id FROM ad

LEFT JOIN tag_ad_map tm ON tm.ad_id=ad.ad_id

WHERE

tm.tag_id IN (99, 10807, 20728, 21, 135)

AND ad.is_removed = 0 AND ad.is_active=1 AND (ad.ant_feedback_alert <= 5 OR
ad.whitelisted = 1)

AND tm.is_active=1 AND ad.ad_id != 32793

GROUP BY tm.ad_id ORDER BY antal DESC LIMIT 10

Explain:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: tm
         type: ref
possible_keys: PRIMARY,tag_id,ad_id,is_active
          key: is_active
      key_len: 4
          ref: const
         rows: 177800
        Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: ad
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: rubbt.tm.ad_id
         rows: 1
        Extra: Using where


tag_ad_map:
Create Table: CREATE TABLE `tag_ad_map` (
  `ad_id` int(11) NOT NULL default '0',
  `tag_id` int(11) NOT NULL default '0',
  `termfreq` int(11) NOT NULL default '0',
  `weight` int(11) NOT NULL default '0',
  `is_active` int(11) NOT NULL default '0',
  PRIMARY KEY  (`tag_id`,`ad_id`),
  KEY `tag_id` (`tag_id`),
  KEY `ad_id` (`ad_id`),
  KEY `is_active` (`is_active`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

tag_keys:
Create Table: CREATE TABLE `tag_keys` (
  `id` int(11) NOT NULL auto_increment,
  `tag` varchar(32) collate utf8_swedish_ci NOT NULL default '',
  `idf` double NOT NULL default '0',
  `url` varchar(64) collate utf8_swedish_ci NOT NULL default '',
  `termfreq` int(11) NOT NULL default '0',
  `weight` int(11) NOT NULL default '0',
  `disable_in_cloud` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `url` (`url`),
  KEY `tag` (`tag`)
) ENGINE=MyISAM AUTO_INCREMENT=49312 DEFAULT CHARSET=utf8
COLLATE=utf8_swedish_ci

Reply via email to