2016-07-12 3 views
0

현재 데이터베이스에서 데이터베이스 레코드로 존재하는 문서에서 PDF 파일을 생성하기 위해 사용자 지정 CI 라이브러리를 사용하고 있습니다.하위 쿼리로 SQL 최적화 및 사용

각 문서는 1 : 다수 관계로 내용 (== 행)과 관련됩니다. 각 행에는 PDF로 인쇄 된 후 사용할 행 수를 나타내는 숫자 (필드 : row_span)가 있습니다. 구축 얻을

PDF 당 페이지, 해당 페이지에 필요한 행은 하위 쿼리 사용하여 선택됩니다 : 코드 $i에서

$where = $this->docType."_id = ".$this->data['doc']->id." AND visible = 1"; 
$sql = "SELECT *, 

    (SELECT 
    sum(row_span) FROM app_".$this->docType."_rows X 
    WHERE X.position <= O.position 
    AND ".$where." 
    ORDER BY position ASC) 'span_total' 

    FROM app_".$this->docType."_rows O 
    WHERE ".$where." 
    HAVING span_total > ".(($i-1)*$this->maxRows)." AND span_total <= ".($i*$this->maxRows)." ORDER BY O.position ASC "; 

$rows = $rows->query($sql); 

페이지 번호와 $this->maxRows는 방법을 나타내는 문서 템플릿 레코드에서로드 PDF 템플릿에 사용 가능한 많은 라인.

그래서 SQL은 ID (834)로 주문 페이지 1 다음과 같을 수 렌더링 할 때 :

SELECT `app_order_rows`.*, 
(SELECT SUM(`app_order_rows_subquery`.`row_span`) AS row_span 
    FROM `app_order_rows` `app_order_rows_subquery` 
    WHERE `app_order_rows_subquery`.`position` <= 'app_order_rows.position' 
    AND `app_order_rows_subquery`.`order_id` = 834 
    AND `app_order_rows_subquery`.`visible` = 1 
    ORDER BY `app_order_rows_subquery`.`position` asc) AS span_total 
FROM (`app_order_rows`) 
WHERE `app_order_rows`.`order_id` = 834 
AND `app_order_rows`.`visible` = 1 
HAVING span_total > 0 
AND span_total <= 45 
ORDER BY `app_order_rows`.`position` asc 

그리고이 EXPLAIN으로 실행하면 출력으로이 제공 :

+====+=============+=========================+======+===============+======+=========+======+======+=============================+===+ 
| id | select_type | table     | type | possible_keys | key | key_len | ref | rows | Extra      | | 
+====+=============+=========================+======+===============+======+=========+======+======+=============================+===+ 
| 1 | PRIMARY  | app_order_rows   | ALL | NULL   | NULL | NULL | NULL | 1809 | Using where; Using filesort | 1 | 
+----+-------------+-------------------------+------+---------------+------+---------+------+------+-----------------------------+---+ 
| 2 | SUBQUERY | app_order_rows_subquery | ALL | NULL   | NULL | NULL | NULL | 1809 | Using where     | 2 | 
+====+=============+=========================+======+===============+======+=========+======+======+=============================+===+ 

이가 훌륭하게 작동하지만 ... 많은 주문이나 송장이있을 때 문서가 매우 느리게 렌더링됩니다. 이는 서브 u 리가 원인 일 수 있습니다.

누군가 하위 쿼리없이 동일한 선택을 수행하는 방법에 대한 아이디어가 있습니까? 어쩌면 행을 선택하고 PDF를 작성하는 완전히 새로운 접근 방식을 찾아야 할 것입니다. 우리는 사전

------------------------------- 편집에 제안 ^^

감사 드실 수 있습니다 인덱스 생성 후 ------------------------------

Explain 스 :

+====+=============+=========================+=======+===============+============+=========+=======+======+=============+===+ 
| id | select_type | table     | type | possible_keys | key  | key_len | ref | rows | Extra  | | 
+====+=============+=========================+=======+===============+============+=========+=======+======+=============+===+ 
| 1 | PRIMARY  | app_order_rows   | ref | index_main | index_main | 5  | const | 9 | Using where | 1 | 
+----+-------------+-------------------------+-------+---------------+------------+---------+-------+------+-------------+---+ 
| 2 | SUBQUERY | app_order_rows_subquery | range | index_main | index_main | 10  | NULL | 1 | Using where | 2 | 
+====+=============+=========================+=======+===============+============+=========+=======+======+=============+===+ 
+0

당신은 SQL 쿼리로이 게시하시기 바랍니다 수 있습니다, 그래서 우리는 우리의 머리에 PHP 구문 분석 할 필요는 없습니다? 그리고이 SQL을 실행하고 EXPLAIN을 얻을 수 있습니까? 그래서 실제 문제가 무엇인지 알 수 있습니까? 그리고 이미 색인이 생성되었는지 확인할 수 있도록 스키마를 게시 할 수 있습니까? –

+0

그것의 대부분은 SQL입니다 :) 나는 내 다음 휴식 시간에 질문을 업데이트 할 것입니다 : D – Brainfeeder

+0

'... 그것은 문서를 매우 느리게 렌더링합니다. 하위 쿼리가 원인 일 수 있습니다. ' 이 행동을 모니터 했습니까 아니면 그냥 추측하고 있습니까? – Philipp

답변

1

이 확인 된 주석에는 테이블에 인덱스가 없습니다.

즉각적인 해결책은 다음과 같습니다

create index index_main on app_order_rows (order_id, position); 
+0

간단한 인덱스 생성으로 해결 될 수 있기를 바랐지만 그렇지 않습니다. – Brainfeeder

+0

인덱스를 만든 후에 EXPLAIN을 게시 할 수 있습니까? –

+0

질문에 추가했습니다. – Brainfeeder