左连接两个视图很慢?

bla*_*kip 2 mysql join

SELECT DISTINCT
viewA.TRID, 
viewA.hits,
viewA.department,
viewA.admin,
viewA.publisher,
viewA.employee,
viewA.logincount,
viewA.registrationdate,
viewA.firstlogin,
viewA.lastlogin,
viewA.`month`,
viewA.`year`,
viewA.businesscategory,
viewA.mail,
viewA.givenname,
viewA.sn,
viewA.departmentnumber,
viewA.sa_title,
viewA.title,
viewA.supemail,
viewA.regionname
FROM
viewA
LEFT JOIN viewB ON viewA.TRID = viewB.TRID
WHERE viewB.TRID IS NULL 
Run Code Online (Sandbox Code Playgroud)

我有两个视图,其中有大约 10K 和 5K 记录。他们每个人都来得很快——不到一秒。当我尝试从 ViewA 获取 ViewB 中不存在的所有记录时,它可以工作,但速度非常慢。所有底层 TRID 字段都是相同的字符集,并且全部设置为 varchar (10),索引和表都是 Innodb。现在查询需要 16 秒。有什么我可以做的吗?

Mar*_*ams 5

通常,使用 时JOIN,MySQL 必须对每个连接的记录进行查找。使用键时查找速度很快,但在您的情况下,实际上没有任何键,因为连接的表是一个视图。

为了尝试让 MySQL 在第一个视图中的每个记录后面运行一次查询,我们可以使用子查询。

SELECT *
FROM viewA
WHERE TRID NOT IN (SELECT TRID FROM viewB);
Run Code Online (Sandbox Code Playgroud)

这应该允许 MySQL 获取子查询(在临时表中)中 viewB 的所有 TRID 值,然后对它们进行搜索以查找 viewA 中的每条记录。

来自MySQL 文档

MySQL 只执行一次不相关的子查询。使用 EXPLAIN 来确保给定的子查询确实是不相关的。

  • @DavidKnipe,我重新阅读了原始查询,我仍然认为“NOT IN”是正确的。 (2认同)