MySQL加入慢速查询

时间:2012-06-06 17:53:53

标签: mysql performance left-join

我有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

2 个答案:

答案 0 :(得分:2)

解决!

问题是按顺序,当使用mysql命令创建临时文件(解释... 使用临时)时,此临时文件太大导致滞后。

提示:

  • 避免使用Tempoaray
  • 使用临时时不要加载太多数据。

答案 1 :(得分:0)

我怀疑你已经在t1.name上有一个索引,但它正在下降而不是提升。这就解释了为什么第二个查询要快得多。

另一个解释是第一个查询没有被缓存,但第二个查询在缓存中找到数据并且运行得更快。