튜닝 방법

개발 가이드를 준수하지 않아 발생하는 모든 문제는 전적으로 이용자에게 책임이 있습니다!

📌 데이터베이스 생성

Engine 타입

  • 테이블 생성 시, Engine 타입은 솔루션의 기본값인 InnoDB 를 사용해야 합니다.

  • 다른 타입의 Engine을 사용할 경우 테이블의 깨짐 등의 문제 발생

Character set, Collation

  • Character set: utf8mb4

  • Collation: utf8mb4_general_ci

  • Character set 과 Collation 는 위에 명시된 솔루션 기본값을 사용해야 합니다.

  • 솔루션 기본값과 다르게 사용할 경우 테이블 간 조인(Join) 시 에러가 발생합니다.

    • Error Code : 1267. Illegal mix of collations

Primary key

  • Primary Key는 필수로 생성해야 합니다.

  • InnoDB 엔진의 테이블은 Primary key 기반으로 정렬 및 저장되기에 필수적으로 필요합니다.

Comment

  • 테이블 생성 및 컬럼 추가 시 Comment를 작성해야 합니다.

  • Comment을 작성해야만 해당 테이블이나 컬럼의 용도를 정확하게 확인할 수 있습니다.

Prefix

  • 테이블 생성 및 컬럼 추가 시 접두사(prefix)를 사용해야 합니다.

  • 솔루션 자동 패치에서 동일한 테이블이나 컬럼이 추가될 경우 오류가 발생하기 때문에 업체만의 접두사를 만들어 사용해야 합니다.

  • es_ , zz_ 는 솔루션에서 사용하는 접두사로, 튜닝 시 사용 금지합니다.

솔루션 제공 기본 데이터

Table, Column

  • 솔루션에서 기본적으로 제공하는 테이블 및 컬럼명은 수정/삭제를 금지합니다.

  • 솔루션에서 사용하는 부분이기 때문에 수정이나 삭제 시 사이트 오류가 발생합니다.

Column Data Type

  • 솔루션에서 기본 제공하는 컬럼의 데이터타입 수정을 금지합니다.

  • 솔루션 자동 패치 시 원복 또는 다른 형태로 변경되기에 필요한 경우 컬럼을 추가적으로 만들어 사용해야 합니다.

📌 쿼리 작성

문자형, 숫자형 데이터 타입 주의

  • 문자형, 숫자형 데이터 타입에 주의하여 사용해야 합니다.

  • 문자형일 경우 '' 사용 필수입니다.

  • 인덱스에 포함된 컬럼인 경우 인덱스를 사용할 수 없습니다.

    # 숫자형
    WHERE goodsNo = 123456
    
    # 문자형
    WHERE orderNo = '123456'

SELECT 절 '*' 사용 자제

  • SELECT 절의 '*' 사용은 자제하고 가능한 필요한 컬럼만 사용해야 합니다.

  • 사용되지 않을 불필요한 데이터를 반환하거나 자원을 사용할 경우 쿼리 실행 속도에 영향을 줍니다.

    SELECT orderNo, mallSno, memNo ...

WHERE 절 조회 조건 추가

  • WHERE 절에 필수로 조회 조건 작성해야 합니다.

  • 조회 조건이 없을 경우 테이블 전체 조회 발생하여 쿼리 실행 속도에 영향을 줍니다.

    WHERE orderNo = '20240415001010'

JOIN, GROUP BY, ORDER BY

  • 불필요한 JOIN, GROUP BY, ORDER BY 사용은 지양합니다.

  • 불필요한 JOIN 사용 예

    # es_orderGoods 테이블의 컬럼을 사용하지 않음
    SELECT a.orderNo, a.mallSno, a.memNo  
    FROM es_order AS a 
    LEFT JOIN es_orderGoods AS b 
        ON b.sno = a.sno
    WHERE a.order_no = '20240415001010'
  • 불필요한 GROUP BY 사용 예

    # 집계 함수 (COUNT, SUM, MAX 등) 없이 GROUP BY 사용
    SELECT orderNo, mallSno 
    FROM es_order
    WHERE orderStatus = 'o1'
    GROUP BY orderNo, mallSno

조건 컬럼(좌변) 가공 대신 상수 부분을 가공하여 사용

  • 인덱스 컬럼이 비교되기 전에 변형이 일어나는 경우 인덱스를 사용할 수 없습니다.

    # 인덱스 사용 불가
    WHERE SUBSTR(orderStatus, 1, 1) = 'o'
    
    # 인덱스 사용 가능
    WHERE orderStatus like 'o%'

📌 솔루션 수정

DBTableField

DBTableField 란

고도몰 솔루션에서 사용하는 모든 Table 과 Column을 정의해 둔 Class 이며 자동으로 Table 과 Column을 불러와서 사용할수 있게 해주는 기능을 합니다.

DBTableField 위치

고도몰 원본 소스의 Bundle/Component/Database 에 있으며 파일명은 DBTableField.php 입니다.

Table, Column 추가 방법

  • 사용자 소스의 module/Component/Database 폴더 하위에 DBTableField.php 파일을 생성을 합니다.

  • 원본 소스의 Component 를 상속하여 확장 개발을 합니다.

<?php
namespace Component\Database;
class DBTableField extends \Bundle\Component\Database\DBTableField
{
    public static function methodName()
    {
        // some code ...
    }
}

Table 추가

  • es_testTable 라는 Table 추가시 Methods명은 table + es_를 뺀 첫문자 대문자인 table 이름 입니다.

  • val 은 Column 명, typ 은 Column Type 로서 숫자형은 i 문자형은 s, def 은 기본값 입니다.

<?php
namespace Component\Database;
class DBTableField extends \Bundle\Component\Database\DBTableField
{
    public static function tableTestTable()
    {
        $arrField = [
            ['val' => 'sno', 'typ' => 'i', 'def' => null], // 일련번호
            ['val' => 'testNo', 'typ' => 'i', 'def' => '1'], // 테스트 번호
            ['val' => 'testId', 'typ' => 's', 'def' => null], // 테스트 아이디
        ];
        return $arrField;
    }
}

Column 추가

  • 기존의 Methods 를 그대로 사용을 하고 원래 Methods 의 것을 가지고 와서 처리합니다.

  • 아래는 상품 Table에 Column을 추가하는 예제입니다.

<?php
namespace Component\Database;
class DBTableField extends \Bundle\Component\Database\DBTableField
{
    public static function tableGoods($conf = null)
    {
        // 부모 method 상속
        $arrField = parent::tableGoods($conf);
        
        // 추가 필드
        $arrField[] = ['val' => 'testNo', 'typ' => 'i', 'def' => '1']; // 테스트 번호
        $arrField[] = ['val' => 'testId', 'typ' => 's', 'def' => null]; // 테스트 아이디
        
        // 필드값 리턴
        return $arrField;
    }
}

Last updated