SQL 쿼리가 너무 오래 걸리는데 다른 방법이 있나요?
MariaDB에 3D 벡터 이미지를 저장하고 싶지만 데이터를 검색하는 데 시간이 너무 많이 걸려 실용적이지 못합니다.
테이블이 몇 개 있습니다.
x, y, z 좌표에 도면요소 ID를 더한 점 표
고유 ID, 엔터티 유형(텍스트, 선, 폴리선 등)을 포함하는 엔터티 테이블 색상 및 선 유형과 같은 기타 공통 속성
텍스트, 텍스트 높이, 선 두께 및 플래그와 같은 추가 값을 포함하는 일부 보조 테이블은 필드 유형(varchar, int 또는 float)을 기준으로 별도의 테이블로 분할됩니다.
저는 다음과 같이 PHP를 통해 자료에 접근하고 있습니다.
if($result = mysqli_query($conn, "SELECT entityID,X,Y,Z FROM dwgpoints WHERE drawing=".$DrawingID." AND blockID=".$blockID.";"))
{
  $previous_eID=0;
  while($row = mysqli_fetch_array($result))
  {
    $eID=$row['entityID'];
    if($previous_eID!=$eID)
    {
      if($previous_eID)// confirm it's not zero
        renderEntity($image_handle,$DrawingID,$previous_eID,$etype,$colour,$ltype,$points, $transformation, $clip);
      $previous_eID=$eID;
      if($eResult=mysqli_query($conn,"SELECT colour,ltype,etype FROM entity WHERE drawing=".$ID." AND eID=".$eID.";")){
        $erow=mysqli_fetch_assoc($eResult);
        $colour=$erow['colour'];
        $ltype=$erow['ltype'];
        $etype=$erow['etype'];
        $points=[[$row['X'],$row['Y'],$row['Z']]];
      }
    }else{
      $points[]=[$row['X'],$row['Y'],$row['Z']];
    }
  }
}
 
이 프로세스에는 최대 10분이 소요되지만, 예를 들어 Openstreet maps는 유사한 양의 데이터를 사용하여 타일을 렌더링합니다.
EXPLE 지침의 결과는 다음과 같습니다.
MariaDB [wptest_11]> EXPLAIN SELECT entityID,X,Y,Z FROM dwgpoints WHERE drawing=2 AND blockID=-1;
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+
| id   | select_type | table     | type | possible_keys | key    | key_len | ref         | rows  | Extra                 |
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+
|    1 | SIMPLE      | dwgpoints | ref  | idx_id        | idx_id | 9       | const,const | 24939 | Using index condition |
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+
 
데이터 검색을 간소화하여 프로세스 시간을 관리할 수 있습니까?저는 저렴한 VPS를 사용하고 있기 때문에 하드웨어 성능 문제가 있을 수 있습니다. 어떤 경우에 업그레이드를 하면 큰 차이가 있습니까?아니면 접근 방식을 재고해야 합니까?
어떤 조언이든 환영합니다.
참고로, 저는 더 나은 성능을 가진 라즈베리 파이3에서 수백만 개의 레코드를 실행했습니다.하드웨어가 도움이 되지만, 먼저 다음을 살펴보겠습니다.
- 애플리케이션에 적합한 경우 통화 최소화
 - 성능 향상을 위해 WHERE 절의 필드에 일부 인덱스 추가
 
단일 쿼리
다음 쿼리를 필요에 맞게 조정합니다.그럼 시간이 어떻게 되는지 보세요.26k 결과의 경우 1초 미만이어야 합니다.
SELECT 
    a.entityID
  , a.X
  , a.Y
  , a.Z 
  , b.colour
  , b.ltype
  , b.etype 
  , b.drawing
 FROM dwgpoints   a
 LEFT JOIN entity b 
 ON     b.eID     = a.entityID 
    AND b.drawing = a.drawing
 WHERE 
     a.drawing = ".$ID." 
 AND a.blockID = ".$blockID.
 ;
 
인덱스
일부 인덱스 만들기:
- 의 조합
drawing그리고.blockID를 위해dwgpoints테이블. - 의 조합
drawing그리고.eID를 위해entity테이블. 
위 쿼리를 다시 실행하십시오. 개선 사항이 있을 것입니다.
또한 테이블 사이에 외부 키를 추가하여 데이터베이스의 데이터 무결성을 개선하는 데 도움이 될 것입니다.
언급URL : https://stackoverflow.com/questions/58517380/my-sql-query-is-taking-too-long-is-there-another-approach
'itsource' 카테고리의 다른 글
| 구조물 변수에 값 할당 (0) | 2023.08.15 | 
|---|---|
| PDO 연결 배열로 모든 그룹 키-값 쌍 가져오기 (0) | 2023.08.15 | 
| Swift에서 증가된 값으로 배열을 만드는 방법은 무엇입니까? (0) | 2023.08.15 | 
| 도커가 도커 데몬에 연결할 수 없음 (0) | 2023.08.15 | 
| Nuget에서 "실행 중인 스크립트가 사용되지 않도록 설정되었기 때문에 ps1을 로드할 수 없습니다."라는 오류 메시지를 표시합니다. (0) | 2023.08.10 |