I have the following 2 tables:

CREATE TABLE media (
  id int(10) unsigned NOT NULL auto_increment,
  user_id int(10) unsigned default NULL,
  title varchar(255) NOT NULL,
  description text NOT NULL,
  `hash` varchar(255) NOT NULL,
  length float(9,2) NOT NULL,
  created timestamp NOT NULL default CURRENT_TIMESTAMP,
  `type` enum('video','image') default NULL,
  `status`
enum('new','processing','suspended','active','deleted','failed','pending')
NOT NULL default 'new',
  flags int(20) NOT NULL,
  PRIMARY KEY  (id),
  UNIQUE KEY `hash` (`hash`),
  KEY `type` (`type`),
  KEY user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

and

CREATE TABLE media_views (
  media_id int(20) unsigned NOT NULL,
  user_id int(12) unsigned NOT NULL,
  views int(20) unsigned NOT NULL,
  30d int(20) unsigned NOT NULL,
  7d int(20) unsigned NOT NULL,
  24h int(20) unsigned NOT NULL,
  site30d int(11) unsigned NOT NULL default '0',
  site7d int(11) unsigned NOT NULL default '0',
  site24h int(11) unsigned NOT NULL default '0',
  click int(20) NOT NULL,
  last_dt timestamp NOT NULL default '0000-00-00 00:00:00' on update
CURRENT_TIMESTAMP,
  PRIMARY KEY  (media_id),
  KEY last_dt (last_dt),
  KEY user_id (user_id),
  KEY 7d (7d,24h)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

and the following query using them:

  select
  SQL_BIG_RESULT media.*, media_views.*, media.created as dt,
media_views.views + media_views.embeds as alltime_views
  FROM media
  JOIN media_views ON ( media.id = media_views.media_id )
  where
  media.status = 'active'
  and media.type = 'whatever'
  order by
  24h DESC, media.created desc LIMIT 0, 20

each table has about 125,000 records, and the query takes about 4 seconds to
run.

When I run explain on the query, it says:

+----+-------------+-------------+--------+---------------+---------+---------+-------------------+-------+----------------------------------------------+
| id | select_type | table       | type   | possible_keys | key     |
key_len | ref               | rows  |
Extra                                        |
+----+-------------+-------------+--------+---------------+---------+---------+-------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | media       | ref    | PRIMARY,type  | type    |
2       | const             | 56518 | Using where; Using temporary; Using
filesort |
|  1 | SIMPLE      | media_views | eq_ref | PRIMARY       | PRIMARY |
4       | awv_free.media.id |     1
|                                              |
+----+-------------+-------------+--------+---------------+---------+---------+-------------------+-------+----------------------------------------------+

When I try to add a force index (PRIMARY) after the media table to try and
make is use PRIMARY, rather than TYPE, the optimizer switches and uses no
key at all. I've tried to change the order in which the tables are selected,
but it seems to have no effect. In some scenarios it will switch and use the
media_views table, but the rows is still 125,000+ using temporary and
filesort.

how can I get this query time down?

Reply via email to