2011-03-01 7 views
-3
SELECT 
sql_no_cache 
COUNT(p.id) 
FROM shop_products p  
LEFT OUTER JOIN shop_currency currency ON (p.currencyId=currency.id) 
INNER JOIN shop_l2p l2p2 FORCE INDEX(show2) ON (p.id=l2p2.pid and l2p2.status>0) 
INNER JOIN shop_labels l2 ON (l2p2.lid=l2.id and l2.type=2 and l2.status=1) 
LEFT JOIN shop_l2p l2p3 ON (p.id=l2p3.pid and l2p3.status=1) 
LEFT JOIN shop_labels l3 ON (l2p3.lid=l3.id and l3.type=3 and l3.status=1) 
WHERE 
CONCAT(p.label,l3.label,l2.label,p.stockCode) LIKE '%moda%' 
AND p.status='1' A 
ND p.stockAmount<>0 
AND p.isOption=0 
limit 1; 

+-------------+ 
| COUNT(p.id) | 
+-------------+ 
|  6669 | 
+-------------+ 
1 row in set (3.91 sec) 

다른 아이디어가 있습니까?계산 시간이 너무 깁니다.

+0

하면 해당 테이블에 어떤 인덱스를해야합니까 너무 오래 시간을 변경 좋아하는? 쿼리의 실행 계획은 무엇입니까? – andri

+0

인덱스가 생성 되었습니까? 검색 문자열에 앞의 인덱스에서'% '가 포함되면'% moda %'와 같이 작동하지 않을 것입니다. –

+0

색인을 가지고있는 위치, 어쩌면 얼마나 많은 레코드를 가지고 있는지 더 자세히 설명해야합니다. –

답변

0

이 성능 문제를 해결하는 가장 좋은 방법은 쿼리 (또는 쿼리 중에)에서 분석기를 실행하는 것이고 문제를 일으키는 절을 정확히 찾아내는 것입니다.

+0

안녕하세요, 다중 joinli 구조보다 더 빨리 계산할 수 있습니까? –

1

연결을 해제하십시오. 다른 분야의 어디에 두십시오.

WHERE 
    (p.label LIKE '%moda%' or 
    l3.label LIKE '%moda%' or 
    l2.label LIKE '%moda%' or 
    p.stockCode LIKE '%moda%') 
    AND .... 

이 레이블의 경우 전체 텍스트 색인을 사용하는 것이 좋지만 다소 다른 방법으로 검색 할 수 있습니다. 이것은 장점이 될 수도 있고 단점이 될 수도 있습니다. 장점은 일치 여부에 관계없이 결과 당 점수를 얻을 수 있다는 것입니다.

+0

좋은 호출입니다 .CONCAT은 효율적인 인덱스 사용을 방해합니다. – Seth

+0

정확히 해결책은 'moda'가 p.label = 'amo'및 l3.label = 'd'및 l2.label = 'aa'와 같이 연결 경계를 넘어서는 경우 일치하지 않습니다. 어쨌든 그것은 이상한 것처럼 보이기 때문에이 행동이 바람직한 지 여부입니다. – sfussenegger

+0

다른 레이블을 검색하고 연결된 경계를 검색하는 것이 의미가 없기 때문에 나는 원하지 않는다고 생각했습니다. 하지만 당신 말이 맞아요, 제 구현은 다른 결과를 가져올 수 있다고 언급 했어야합니다. – GolezTrol

0

이러한 변경을 시도 :

SELECT 
sql_no_cache 
COUNT(p.id) 
FROM shop_products p  
INNER JOIN shop_l2p l2p2 FORCE INDEX(show2) ON (p.id=l2p2.pid and l2p2.status>0) 
INNER JOIN shop_labels l2 ON (l2p2.lid=l2.id and l2.type=2 and l2.status=1) 
LEFT JOIN shop_l2p l2p3 ON (p.id=l2p3.pid and l2p3.status=1) 
LEFT JOIN shop_labels l3 ON (l2p3.lid=l3.id and l3.type=3 and l3.status=1) 
WHERE 
p.status='1' and 
AND p.stockAmount<>0 
AND p.isOption=0 
(p.label like '%moda%' 
or l3.label like '%moda%' 
or l2.label like '%moda%' 
or p.stockCode like '%moda%') 
limit 1; 

이유 :

  • 는 밤은 사용 shop_currency 조인 왼쪽.
  • CONCAT은 필요없는 모든 thos 필드를 강제로 처리합니다.
  • 가장 빠른 필드를 먼저 필터링하면 문자열을 확인할 필요가 없습니다.
0
1 SIMPLE p ref  PRIMARY,productAdmin,isOption,show,status,stockAmo... status 1 const 40018 Using where 
1 SIMPLE l2p3 ref  lid,show2,pid,l2p_products show2 5 ideashopfix.p.id,const 2 Using where 
1 SIMPLE l3 eq_ref PRIMARY,show,type,typeStatus,status  PRIMARY  4 ideashopfix.l2p3.lid 1 Using where 
1 SIMPLE l2p2 ref  show2 show2 4 ideashopfix.p.id 3 Using where 
1 SIMPLE l2 eq_ref PRIMARY,show,type,typeStatus,status  PRIMARY  4 ideashopfix.l2p2.lid 1 Using where 

CONCAT는 (4.07 초)

관련 문제