您将如何优化此MySQL查询

时间:2013-07-11 22:16:29

标签: mysql sql

任何人都可以帮我优化这个查询,

SELECT(X1,      
    X2   
FROM TABLEAA   
 WHERE   
        Y IN (SELECT Y FROM TABLEBB WHERE Z=SELECTED)   
    AND Y  IN  (SELECT Y  FROM TABLECC  WHERE ZZ=SELECTED)    
)

在哪里

TABLEAA : 1 million enteries    
TABLEBB : 22 million enteries    
TABLECC : 1.2 million enteries  

它有效,但需要花费太多时间,差不多30秒

还有其他方法可以解决这个问题吗?

编辑:Z和ZZ完全是两个不同的列

4 个答案:

答案 0 :(得分:2)

对于两个连接表,不是使用子查询,而是将TABLEBB和TABLECC连接到TABLEAA,并在WHERE子句中检查ZZ = SLECTED。

确保参与外部联接的列已编制索引。

答案 1 :(得分:2)

我会使用JOINs

SELECT DISTINCT
    A.X1,      
    A.X2   
FROM TABLEAA A
   JOIN TABLEBB B ON A.Y = B.Y AND B.Z='SELECTED'
   JOIN TABLECC C ON A.Y = C.Y AND C.Z='SELECTED'

另外,请确保在A.Y,B.Y和C.Y上有适当的索引。您可以通过在Z列上添加索引来获得更好的性能 - 这取决于您的表结构和其他几个因素。

答案 2 :(得分:0)

...索引

  • Z
  • 中为TABLEBB添加索引
  • ZZ
  • 中为TABLECC添加索引
  • Y
  • 中为TABLEAA添加索引

答案 3 :(得分:0)

SELECT X1, X2 FROM TABLEAA 
JOIN TABLEBB ON Y = Y JOIN TABLECC ON Y = Y 
WHERE TABLEBB.Z = SLECTED && TABLECC.ZZ = SLECTED