2014-06-18 2 views
0

레코드 표시를 위해 10 분 이상 처리중인 매우 큰 MYSQL 쿼리에 문제가 있습니다.MYSQL LARGE 쿼리 속도 향상

쿼리는 다음과 같습니다 : 나는 하나 하나 (그 2 개 테이블이 매우 큰)에 가입되어 있어야합니다이 개 테이블을 사용하고 있음을

SELECT SQL_CALC_FOUND_ROWS * FROM (
     SELECT 't-0' as typo, sh_inquiry.id as ref, sh_inquiry.pid as pid, partner, sh_inquiry.order, if(p_status IS NULL OR p_status = 0,'not paid','paid') as payment, p_voucher, country, city, delivery_date, sh_inquiry.amount as c_amount, currency as c_currency, NULL as s_amount, NULL as s_currency, IF(confirmed=0,if(delivered=0,"not confirmed","delivered"),if(delivered=0,"confirmed","delivered")) as conf 
     FROM sh_inquiry 
     LEFT JOIN sh_orders ON sh_inquiry.id = sh_orders.i_id 
       LEFT JOIN sh_partners ON sh_partners.pid = sh_inquiry.pid 
       LEFT JOIN sh_currency ON sh_currency.id = sh_inquiry.curr_id 
       LEFT JOIN sh_country ON sh_country.id = sh_inquiry.cid 
       LEFT JOIN sh_debts ON sh_inquiry.id = sh_debts.i_id 
     WHERE sh_inquiry.del = 0 AND sh_inquiry.type = 1 AND sh_orders.del = 0 
     UNION 
       SELECT 't-1' as typo, sh_orders.i_id as ref, sid as pid, partner, sh_inquiry.order, if(p_status IS NULL OR p_status = 0,'not paid','paid') as payment, p_voucher, country, city, delivery_date, NULL as c_amount, NULL as c_currency, sh_orders.amount as s_amount, currency as s_currency, IF(confirmed=0,if(delivered=0,'not confirmed','delivered'),if(delivered=0,'confirmed','delivered')) as conf FROM sh_orders 
       LEFT JOIN sh_partners ON sh_partners.pid = sh_orders.sid 
       LEFT JOIN sh_currency ON sh_currency.id = sh_orders.curr_id 
       LEFT JOIN sh_inquiry ON sh_inquiry.id = sh_orders.i_id 
       LEFT JOIN sh_country ON sh_country.id = sh_inquiry.cid 
       LEFT JOIN sh_debts ON sh_orders.id = sh_debts.o_id 
       WHERE sh_orders.del = 0 AND sh_inquiry.del = 0 
     ) AS U 

     ORDER BY typo ASC, delivery_date 
        asc 
     LIMIT 0, 10 

문제는, 내가 사용하고 이유는 UNION 문. jquery datatables serverside 페이지에 레코드를 표시하므로 표시된 레코드를 제한하는 것이 원인을 돕지 않습니다.

누구나이 쿼리의 속도를 높이는 데 필요한 아이디어를 생각해 낼 수 있습니까? 데이터베이스 구조에 대한 자세한 정보가 필요하면 질문하십시오.

(가) 해고 한 Statment을 EXPLAIN :

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  <derived2> ALL  NULL NULL NULL NULL 17630 Using filesort 
2 DERIVED  sh_orders ALL  i_id NULL NULL NULL 8696 Using where 
2 DERIVED  sh_inquiry eq_ref PRIMARY,id PRIMARY  4 reur3918_sh.sh_orders.i_id 1 Using where 
2 DERIVED  sh_partners  eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_inquiry.pid 1 
2 DERIVED  sh_currency  eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_inquiry.curr_id 1 
2 DERIVED  sh_country eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_inquiry.cid 1 
2 DERIVED  sh_debts ALL  NULL NULL NULL NULL 18678 
3 UNION sh_orders ALL  i_id NULL NULL NULL 8696 Using where 
3 UNION sh_partners  eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_orders.sid 1 
3 UNION sh_currency  eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_orders.curr_id 1 
3 UNION sh_inquiry eq_ref PRIMARY,id PRIMARY  4 reur3918_sh.sh_orders.i_id 1 Using where 
3 UNION sh_country eq_ref PRIMARY  PRIMARY  4 reur3918_sh.sh_inquiry.cid 1 
3 UNION sh_debts ALL  NULL NULL NULL NULL 18678 
NULL UNION RESULT <union2,3> ALL  NULL NULL NULL NULL NULL  

모든 ID를 색인 한 후 쿼리가 133 초 걸리는 것 ..

+0

기본 규칙 : 의사 결정 컨텍스트에서 사용되는 모든 필드에 인덱스를 넣습니다. 'where','join','order','group' 등 ... –

+0

각 테이블의 행은 몇 개입니까? 이미 시도해 보았던 최적화 유형과 실제로 어떤 것에 대한 아이디어를 제공 할 것입니다. –

+1

쿼리에 대해 EXPLAIN을 실행하여 광고를 실제로 사용중인 인덱스를 확인하십시오. –

답변

0

을 당신이 아이디어를 여러분 모두 감사합니다! 사실, EXPLAIN 문을 실행하면 테이블에 INDEX가 정의되어 있지 않음을 알 수있었습니다. 쿼리에 사용 된 모든 필드에 INDEX를 추가 한 후 (주로 JOIN ON 절에서) 실행 시간이 0.83 초로 감소했습니다.