현재 데이터베이스에서 데이터베이스 레코드로 존재하는 문서에서 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 |
+====+=============+=========================+=======+===============+============+=========+=======+======+=============+===+
당신은 SQL 쿼리로이 게시하시기 바랍니다 수 있습니다, 그래서 우리는 우리의 머리에 PHP 구문 분석 할 필요는 없습니다? 그리고이 SQL을 실행하고 EXPLAIN을 얻을 수 있습니까? 그래서 실제 문제가 무엇인지 알 수 있습니까? 그리고 이미 색인이 생성되었는지 확인할 수 있도록 스키마를 게시 할 수 있습니까? –
그것의 대부분은 SQL입니다 :) 나는 내 다음 휴식 시간에 질문을 업데이트 할 것입니다 : D – Brainfeeder
'... 그것은 문서를 매우 느리게 렌더링합니다. 하위 쿼리가 원인 일 수 있습니다. ' 이 행동을 모니터 했습니까 아니면 그냥 추측하고 있습니까? – Philipp