首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL性能:...IN (选择.)相对于IN ('12','18',30‘)与临时表

问MySQL性能:...IN (选择.)相对于IN ('12','18',30‘)与临时表
EN

Stack Overflow用户
提问于 2013-06-21 06:50:49
回答 1查看 176关注 0票数 1

我有很多类似的电话。以下是其中一项:

代码语言:javascript
复制
$STH = $DBH->prepare("
SELECT t.mobile, t.unum
FROM teacher t
LEFT JOIN s_group_member m ON m.unum = t.unum
LEFT JOIN s_group g ON g.gnum = m.gnum
WHERE m.gnum = :g AND g.unum = :u
  AND t.unum NOT IN (SELECT unum FROM t_unav WHERE unav_date = :d)");

它从teacher表中获取数据,其中(1)教师是指定组的成员,(2)组属于用户,(3)教师不是不可用的。

我的问题涉及到最迅速的问题:

  1. 每次进行子选择呼叫。
  2. 将子选择缓存到数组中,然后在这个职位中使用in (这个职位).
  3. 创建一个临时表。

类似的电话打了几次-可能是20-30次.

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-21 07:04:57

您的示例中的子查询应该是物化,这意味着它将只执行一次 (mysql将自动创建一个tmp表来存储来自子查询的结果)。

使用临时表的子查询物化避免了这种重写,并使得只执行子查询一次而不是每行执行一次外部查询成为可能。物化通过生成子查询结果作为临时表(通常在内存中)来加快查询执行速度。当MySQL第一次需要子查询结果时,它将该结果具体化为一个临时表。任何后续的结果需要时,MySQL都会再次引用临时表。

但是,如果子查询的结果不是很大,您确实可以将它们放在数组中,那么它应该会更快一些。

此外,还可以查看EXISTS优化这里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17229275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档