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查询以将执行时间缩短到不到半分钟?
答案 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)
。
INDEX
会提高效率。wfd
,使用payer_map_id
。 wfd
有一个很好的索引。nl
将使用uid
。再次有一个非常好的索引。实际上,INDEX(uid, ndc)
因为是一个“覆盖”指数会稍好一些。或者,由于PRIMARY KEY
的“聚类”,切换到InnoDB会很好。始终提供EXPLAIN SELECT...;
以查看优化程序正在执行的操作。
与优化无关:
PRIMARY KEY (payer_map_id),
KEY payer_map_id (payer_map_id),
PRIMARY KEY
是UNIQUE KEY
是KEY
,因此后者完全是多余的; DROP
它。同上uid
。
My cookbook详细介绍了如何从SELECT
创建索引。