MySQL 在 JOIN 值上执行 ORDER BY 时速度缓慢?

标签 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

最佳答案

对于此查询:

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)。我猜测即使使用这些索引,性能也会与您现在的性能相似。

关于MySQL 在 JOIN 值上执行 ORDER BY 时速度缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35590146/

相关文章:

mysql - 我如何使用mysql从数据库中获取这些?

sql - 锁定插入件

c# - ComboBox SelectedIndexChanged 和 Mysql fatal error

mysql - 无法调整mysql超时

java - 从 SQL 中的单独表中获取 ID

c# - groupby 之后的 linq 无法获取列值

mysql - 使用子查询将 2 个 SQL 查询转化为 1 个 SQL 查询

mysql加入多对多关系

mysql - 为联合查询创建表 - 语法错误

javascript - 使用 POST 的 NodeJS 快速身份验证返回错误 发送后无法设置 header