1

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

4

2 回答 2

2

解决了!

问题出在 order by,当使用 order by mysql 创建一个临时文件(解释...使用 Temporary)时,这个临时文件太大导致滞后。

提示:

  • 避免使用 Tempoaray
  • 使用临时时不要加载太多数据。
于 2012-06-15T12:43:53.917 回答
0

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

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

于 2012-06-06T18:00:06.873 回答