【问题标题】:MySQL performance: ...IN (SELECT...) vs IN ('12', '18', 30'...) vs Temporary TableMySQL 性能:...IN (SELECT...) vs IN ('12', '18', 30'...) vs 临时表
【发布时间】:2013-06-21 06:50:49
【问题描述】:

我有许多类似的电话。下面是一个:

$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. 将子选择缓存到一个数组中,然后像this post 一样使用IN($array)。
  3. 创建一个临时表。

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

谢谢。

【问题讨论】:

    标签: mysql performance caching temp-tables subquery


    【解决方案1】:

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

    使用临时表实现子查询可避免此类重写 并且可以只执行一次子查询而不是 每行外部查询一次。物化加速查询 通过生成子查询结果作为临时表执行, 通常在内存中。 MySQL 第一次需要子查询结果时,它 将该结果具体化到一个临时表中。任何后续时间 需要结果,MySQL再次引用临时表。

    但如果子查询的结果不大,你确实可以将它们放入数组中,它应该会快一点。

    也可以看EXISTS优化here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 2016-03-16
      • 2021-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-09-26
      • 2018-09-28
      • 1970-01-01
      相关资源
      最近更新 更多