优化mysql查询,需要大约4分钟的执行时间

时间:2015-06-14 06:52:20

标签: java mysql database-performance

Converter

下面的mysql表是myisam引擎

 select nl.ndc, formulary_status FROM bh.webdav_formulary_detail wfd 
 INNER JOIN bh.payer_map pm ON wfd.payer_map_id = pm.payer_map_id 
 INNER JOIN bh.ndc_lookup nl ON wfd.product_id = nl.uid 
 WHERE pm.payer_id ='P00000000001001' 
   and pm.formulary_id='01244' 
   and nl.ndc in ('16590061572' , '35356078830' , '35356078860' , '35356078890' , 
                  '49999085690' , '54868381500' , '54868381501' , '54868381503' , 
                  '54868381504' , '54868381505' , '59011044010' , '59011044020' , 
                  '63629377401' , '63629377402' , '63629377403');

如何优化上面的mysql查询以将执行时间缩短到不到半分钟?

1 个答案:

答案 0 :(得分:0)

WHERE pm.payer_id ='P00000000001001' 
  and pm.formulary_id='01244' 

请求payer_map上的综合索引:INDEX(payer_id, formulary_id)(或相反的顺序)。稍微好一点的是切换到InnoDB或创建一个“覆盖”索引:INDEX(payer_id, formulary_id, payer_map_id)

  1. 优化器很可能从具有最佳过滤可能性的表开始 - pm。我给你的INDEX会提高效率。
  2. 下一个表格必须为wfd,使用payer_map_idwfd有一个很好的索引。
  3. 最后nl将使用uid。再次有一个非常好的索引。实际上,INDEX(uid, ndc)因为是一个“覆盖”指数会稍好一些。或者,由于PRIMARY KEY的“聚类”,切换到InnoDB会很好。
  4. 始终提供EXPLAIN SELECT...;以查看优化程序正在执行的操作。

    与优化无关:

    PRIMARY KEY      (payer_map_id),
    KEY payer_map_id (payer_map_id),
    

    PRIMARY KEYUNIQUE KEYKEY,因此后者完全是多余的; DROP它。同上uid

    My cookbook详细介绍了如何从SELECT创建索引。