MySQL在JOIN值上完成慢速ORDER BY?

时间:2016-02-23 23:14:02

标签: mysql sql join optimization sql-order-by

我有这个问题:

SELECT
    c.*,
    cv.views
FROM 
    content AS c
JOIN
    content_views AS cv ON cv.content = c.record_num
WHERE 
    c.enabled = 1
ORDER BY
    cv.views

非常简单,但它真的很慢......有没有办法让它更快?

这是我的解释:

id     select_type     table     type     possible_keys          key          key_len     ref          rows     Extra
1      SIMPLE          c         ref      enabled_2,enabled      enabled      4           const        23947    Using temporary; Using filesort
1      SIMPLE          cv        eq_ref   PRIMARY                PRIMARY      4           c.record_num 1    

编辑2016-02-24

请注意,通常情况下,我使用LIMIT,因此EXPLAIN中返回的记录数量并不完全准确,但为了简单起见,并且性能不会随着LIMIT的变化而变化它,我把它删除了。

根据评论中的要求,这是我的SHOW CREATE TABLE的结果。如您所见,我的一张桌子是MyISAM,另一张是InnoDB。

CREATE TABLE `content` (
 `title` varchar(255) NOT NULL DEFAULT '',
 `filename` varchar(255) NOT NULL DEFAULT '',
 `filename_2` varchar(255) NOT NULL,
 `filename_3` varchar(255) NOT NULL,
 `orig_filename` varchar(255) NOT NULL,
 `trailer_filename` varchar(255) NOT NULL,
 `thumbnail` varchar(255) NOT NULL DEFAULT '',
 `embed` text NOT NULL,
 `description` text NOT NULL,
 `paysite` int(11) NOT NULL DEFAULT '0',
 `keywords` varchar(255) NOT NULL,
 `model` varchar(255) NOT NULL DEFAULT '',
 `scheduled_date` date NOT NULL DEFAULT '0000-00-00',
 `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `encoded_date` datetime NOT NULL,
 `rating` int(5) NOT NULL DEFAULT '0',
 `length` int(11) NOT NULL DEFAULT '0',
 `submitter` int(11) NOT NULL DEFAULT '0',
 `ip` varchar(15) NOT NULL,
 `approved` int(11) NOT NULL DEFAULT '0',
 `hotlinked` varchar(1024) NOT NULL,
 `plug_url` varchar(255) NOT NULL,
 `enabled` int(11) NOT NULL DEFAULT '0',
 `main_thumb` int(11) NOT NULL DEFAULT '3',
 `xml` varchar(32) NOT NULL,
 `photos` int(11) NOT NULL DEFAULT '0',
 `mobile` varchar(255) NOT NULL,
 `modeltmp` varchar(255) NOT NULL,
 `movie_width` int(11) NOT NULL,
 `movie_height` int(11) NOT NULL,
 `token` varchar(255) DEFAULT NULL,
 `source_thumb_url` varchar(255) NOT NULL,
 `related` varchar(1024) NOT NULL,
 `force_related` varchar(255) NOT NULL,
 `record_num` int(11) NOT NULL AUTO_INCREMENT,
 `webvtt_src` text NOT NULL,
 `category_thumb` int(11) NOT NULL,
 `related_date` date NOT NULL,
 `publish_ready` tinyint(1) NOT NULL,
 PRIMARY KEY (`record_num`),
 KEY `encoded_date` (`encoded_date`,`photos`,`enabled`),
 KEY `filename` (`filename`),
 KEY `scheduled_date` (`scheduled_date`),
 KEY `enabled_2` (`enabled`,`length`,`photos`),
 KEY `enabled` (`enabled`,`encoded_date`,`photos`),
 KEY `rating` (`rating`,`enabled`,`photos`),
 KEY `token` (`token`),
 KEY `submitter` (`submitter`),
 FULLTEXT KEY `keywords` (`keywords`,`title`),
 FULLTEXT KEY `title` (`title`),
 FULLTEXT KEY `description` (`description`),
 FULLTEXT KEY `keywords_2` (`keywords`)
) ENGINE=MyISAM AUTO_INCREMENT=124207 DEFAULT CHARSET=latin1

CREATE TABLE `content_views` (
 `views` int(11) NOT NULL,
 `content` int(11) NOT NULL,
 PRIMARY KEY (`content`),
 KEY `views` (`views`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 个答案:

答案 0 :(得分:0)

对于此查询:

SELECT c.*, cv.views
FROM content c JOIN
     content_views cv
     ON cv.content = c.record_num
WHERE c.enabled = 1
ORDER BY cv.views;

最佳索引可能是content(enabled, record_num)content_views(content, views)。我猜测即使这些索引的性能也与你现在的相似。