【问题标题】:How to optimize IN constraint query?如何优化IN约束查询?
【发布时间】:2013-12-22 07:09:21
【问题描述】:

以下是我的查询。

SELECT * FROM t1 WHERE t1.record_id IN (
    SELECT  t2.record_id FROM  t2 
        INNER JOIN t3 ON CONCAT(t2.case_number,t2.courtfile_type) = CONCAT(t3.case_number,t3.courtfile_type))

它包含 IN 约束,从 database.Database 提取结果需要花费大量时间,显然是巨大的。

如何优化这个查询?

【问题讨论】:

  • 是否所有用于 IN 查询和 JOIN 的字段都具有索引。如果没有,请添加索引并再次尝试 EXPLAIN 相同的查询。

标签: mysql sql select query-optimization in-clause


【解决方案1】:

试试这个:

使用连接

SELECT DISTINCT t1.* 
FROM t1 
INNER JOIN t2 ON t1.record_id = t2.record_id 
INNER JOIN t3 ON t2.case_number = t3.case_number AND t2.courtfile_type = t3.courtfile_type

使用存在

SELECT * 
FROM t1 
WHERE EXISTS (SELECT t2.record_id 
                  FROM  t2 INNER JOIN t3 ON t2.case_number = t3.case_number AND t2.courtfile_type = t3.courtfile_type
                  WHERE t1.record_id = t2.record_id )

使用EXPLAIN关键字检查查询的执行计划并对表进行适当的索引。

【讨论】:

  • 请记住,使用JOIN 可能会导致重复,如果是这种情况,则选择必须是SELECT DISTINCT t1.*(尽管我不提倡使用 SELECT *,因为我不't t1 有哪些列我别无选择,只能写)
  • @GarethD 我也同意你关于SELECT * 的看法。但我不知道表结构,所以我写了*
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多