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 秒。有什么我可以做的吗?
通常,使用 时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 来确保给定的子查询确实是不相关的。