2016-02-25 146 views
0

有没有什么办法可以加快以下MySQL的查询?通过用JOIN或其他方式替换IN()子句来加速MySQL查询?

SELECT prop1, count(prop2) AS num_of_products FROM products 
WHERE insdate > CURDATE() AND 
    basecat='319' AND 
    prop2 NOT IN(SELECT number1 FROM categories WHERE basecat='319') AND 
    prop2 like '______%%' AND 
    accountcode IN(427,428,432,434,438,441,445,451,459,461) 
GROUP BY prop1; 

目前性能杀手是IN()子句中的子查询:

prop2 NOT IN(SELECT number1 FROM categories WHERE basecat='319') 

我已经尽我的运气JOINS

SELECT prop1, count(prop2) AS num_of_products FROM (
    SELECT DISTINCT t_a.prop1, t_a.prop2 FROM products t_a 
    LEFT JOIN categories t_b 
     ON t_a.prop2 != t_b.number1 
     WHERE t_a.insdate > CURDATE() AND 
     t_a.basecat ='319' AND 
     t_a.prop2 like '______%%' AND 
     t_a.accountcode IN(427,428,432,434,438,441,445,451,459,461) 
) tmp_q 
WHERE prop1 IN(427,428,432,434,438,441,445,451,459,461) 
GROUP BY prop1; 

这一个是〜17X更快,但它会产生不准确的结果,因为初始测试prop2 NOT IN(subquery)并不等同于t_a.prop2 != t_b.number1

是否有任何其他方式以更智能的方式查询数据库?

回答

0

试试这个:

SELECT * FROM (
    SELECT prop1, count(prop2) AS num_of_products 
    FROM products AS t_a 
    CROSS JOIN (
     SELECT GROUP_CONCAT(number1) AS numbers 
     FROM categories 
     WHERE basecat='319') AS t_b 
    WHERE insdate > CURDATE() AND 
      basecat='319' AND  
      CONCAT(',', numbers, ',') NOT LIKE CONCAT('%,',t_a.prop2,',%') AND 
      prop2 like '______%%' AND 
      accountcode IN(427,428,432,434,438,441,445,451,459,461) 
    GROUP BY prop1 
) tmp_q 
WHERE prop1 IN(427,428,432,434,438,441,445,451,459,461); 

我怀疑我加入的条件是优化搜索,但你可以试试看。

+0

非常感谢,您的解决方案提供了〜23倍的性能提升O_o。我编辑了你的答案以匹配我想要的结果。 –