我有 2 个表 t1 -> t2(常见的一对多关系),表 t2 上有 140.000 条记录,t1 上有 50.000 条记录,有时外键为空(无父)。
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `name_idx` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=125666 DEFAULT CHARSET=utf8
CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`t1_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `t1_id_idx` (`t1_id`)
CONSTRAINT `t1_fk` FOREIGN KEY (`t1_id`) REFERENCES `t1` (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=125666 DEFAULT CHARSET=utf8
此查询运行 15 秒:
SELECT * FROM t2
LEFT JOIN t1 ON t2.t1_id = t1.id
ORDER BY t1.name ASC
LIMIT 10;
此查询运行时间为 0.5 秒:
SELECT * FROM t2
LEFT JOIN t1 ON t2.t1_id = t1.id
WHERE t1.name <> 'any not found value'
ORDER BY t1.name ASC
LIMIT 10;
任何人都可以向我解释为什么会发生这种情况吗?
观察:已编辑。
消息:
此查询运行时间为 0.06 秒:(有什么变化?内连接!!)
SELECT * FROM t2
INNER JOIN t1 ON t2.t1_id = t1.id
ORDER BY t1.name ASC
LIMIT 10;
但上面的查询不是我的解决方案,在我的情况下 t2.t1_id 有时可能为空。
任何想法??
消息:
使用左连接和内连接运行解释:
mysql show:使用临时;使用文件排序;行数:140.000
使用内连接:
mysql显示:使用Where;行数:8