我有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;
任何机构都可以向我解释为什么会这样吗?
Obs:已编辑。
新闻:
这个查询在0.06秒运行:(什么改变?内部连接!!)
SELECT * FROM t2
INNER JOIN t1 ON t2.t1_id = t1.id
ORDER BY t1.name ASC
LIMIT 10;
但是上面的查询不是我的解决方案,在我的情况下,t2.t1_id有时可能为null。
任何想法?
新闻:
使用左侧和内部联接运行 解释 :
Mysql show:使用临时;使用filesort;行:140.000
使用内部联接:
Mysql show:使用Where;行:8
答案 0 :(得分:2)
解决!
问题是按顺序,当使用mysql命令创建临时文件(解释... 使用临时)时,此临时文件太大导致滞后。
提示:
答案 1 :(得分:0)
我怀疑你已经在t1.name
上有一个索引,但它正在下降而不是提升。这就解释了为什么第二个查询要快得多。
另一个解释是第一个查询没有被缓存,但第二个查询在缓存中找到数据并且运行得更快。