仍然在优化 MySQL LEFT JOIN 时遇到问题。该查询需要 0.13 秒才能完成,而不是 0.00 秒(简化)。
我想为那个查询实现 0.00 左右。
我已经尝试过创建索引和组合索引。变化不大。基本上只要 EXPLAIN 中有 FILESORT,它就很慢。我不确定该怎么做...跨表创建索引?它甚至存在吗?
谢谢你。
罪魁祸首:
SELECT
SQL_NO_CACHE p.id
FROM 1_posts p
INNER JOIN 1_topics t
ON (p.cid = t.cid && p.container = t.id)
WHERE
t.cid = 1010699
ORDER BY
p.id DESC
LIMIT 1;
解释输出:
+----+-------------+--------+------+--------------- ----+-------+---------+---------+-- -+----------------------------------------------+ | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 | +----+-------------+--------+------+--------------- ----+-------+---------+---------+-- -+----------------------------------------------+ | 1 | 简单 | 吨 | 参考 | 初级,cid,cid_2 | 西德 | 4 | 常量 | 216 | 使用索引;使用临时的;使用文件排序 | | 1 | 简单 | p | 参考 | 初级,cid,cid_2 | cid_2 | 8 | 常量,forumdb.t.id | 12 | | +----+-------------+--------+------+--------------- ----+-------+---------+---------+-- -+----------------------------------------------+
现在,同样的简化查询可以正常工作(使用索引等。唯一的区别是括号之间):
SELECT
SQL_NO_CACHE p.id
FROM
1_posts p
INNER JOIN 1_topics t
ON (p.cid = t.cid)
WHERE
t.cid = 1010699
ORDER BY
p.id DESC
LIMIT 1;
解释:
+----+-------------+--------+-------+-------------- -----+---------+---------+--------+-------+-------- ------------------+ | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 | +----+-------------+--------+-------+-------------- -----+---------+---------+--------+-------+-------- ------------------+ | 1 | 简单 | p | 范围 | 初级,cid,cid_2 | 初级 | 4 | 空 | 31720 | 使用哪里;使用索引 | | 1 | 简单 | 吨 | 参考 | 初级,cid,cid_2 | cid_2 | 4 | 常量 | 194 | 使用索引 | +----+-------------+--------+-------+-------------- -----+---------+---------+--------+-------+-------- ------------------+
表:
CREATE TABLE `1_posts` (
`cid` int(20) unsigned NOT NULL DEFAULT '0',
`id` int(20) unsigned NOT NULL AUTO_INCREMENT,
`container` int(20) unsigned NOT NULL DEFAULT '0',
`creator` int(20) unsigned NOT NULL DEFAULT '0',
`ref` int(20) unsigned DEFAULT NULL,
`timestamp` int(20) unsigned NOT NULL DEFAULT '0',
`posticon` tinyint(11) DEFAULT NULL,
`last_edited_ts` int(10) unsigned DEFAULT NULL,
`last_edited_by` int(20) unsigned DEFAULT NULL,
`signature` varchar(250) DEFAULT NULL,
`client_ip` int(10) unsigned NOT NULL DEFAULT '0',
`data_format` tinyint(20) unsigned DEFAULT NULL,
`use_bbcode` tinyint(3) unsigned NOT NULL DEFAULT '1',
`use_smileys` tinyint(3) unsigned NOT NULL DEFAULT '1',
`topic_hash` int(10) unsigned NOT NULL DEFAULT '0',
`del_ts` int(10) unsigned NOT NULL DEFAULT '0',
`del_reason` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`cid`,`id`),
UNIQUE KEY `cid` (`cid`,`topic_hash`,`container`,`id`,`del_ts`),
KEY `cid_2` (`cid`,`container`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
CREATE TABLE `1_topics` (
`cid` int(10) unsigned NOT NULL DEFAULT '0',
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`container` int(20) NOT NULL DEFAULT '0',
`name` varchar(128) NOT NULL DEFAULT '',
`creator` int(20) unsigned NOT NULL DEFAULT '0',
`last_modified` int(20) unsigned NOT NULL DEFAULT '0',
`views` int(11) NOT NULL DEFAULT '0',
`closed` tinyint(3) unsigned NOT NULL DEFAULT '0',
`sticky` tinyint(3) unsigned NOT NULL DEFAULT '0',
`last_post_id` int(20) unsigned DEFAULT NULL,
`num_posts` int(10) unsigned DEFAULT NULL,
`lp_ts` int(20) unsigned NOT NULL DEFAULT '0',
`posticon` smallint(5) unsigned DEFAULT NULL,
`hidden` tinyint(3) unsigned NOT NULL DEFAULT '0',
`topic_change_ts` int(10) unsigned NOT NULL DEFAULT '0',
`topic_hash` int(10) unsigned NOT NULL DEFAULT '0',
`forum_hash` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`cid`,`id`),
KEY `container` (`container`),
KEY `last_modified` (`last_modified`),
KEY `sticky` (`sticky`),
KEY `topic_hash` (`topic_hash`),
KEY `forum_hash` (`forum_hash`),
KEY `cid` (`cid`,`id`),
KEY `cid_2` (`cid`),
FULLTEXT KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=211963 DEFAULT CHARSET=latin1
这是添加 Gordon 索引后的 EXPLAIN 输出:
+----+-------------+--------+------+--------------- ----------------+--------+---------+---------------- ------+--------+------------------------------------ ----------+ | 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 | +----+-------------+--------+------+--------------- ----------------+--------+---------+---------------- ------+--------+------------------------------------ ----------+ | 1 | 简单 | 吨 | 参考 | 初级,cid,cid_2 | 西德 | 4 | 常量 | 212 | 使用索引;使用临时的;使用文件排序 | | 1 | 简单 | p | 参考 | 初级,cid,cid_2,cid_3,cid_4 | cid_3 | 8 | 常量,forumdb.t.id | 11 | 使用索引 | +----+-------------+--------+------+--------------- ----------------+--------+---------+---------------- ------+--------+------------------------------------ ----------+