8.2.5 기타 최적화 Tips
이 섹션에서는 쿼리 처리 속도를 향상시키기위한 다양한 많은 팁을 나타냅니다.
연결 오버 헤드를 방지하려면 데이터베이스에 영구 연결을 사용합니다. 영구 연결을 사용할 수 없기 때문에 데이터베이스에 대해 많은 새로운 연결을 시작하는 경우
thread_cache_size
변수 값의 변경이 필요할 수 있습니다. 섹션 8.11.2 "서버 파라미터의 튜닝」 을 참조하십시오.모든 쿼리가 테이블 내에 작성한 인덱스를 실제로 사용하고 있는지 항상 확인합니다. MySQL 그럼,
EXPLAIN
문에서이를 실행할 수 있습니다. ' 섹션 8.8.1 "EXPLAIN으로 쿼리 최적화" "를 참조하십시오.자주 업데이트되는
MyISAM
테이블에 대한 복잡한SELECT
쿼리를 피하고 리더와 라이터의 충돌로 인해 발생하는 테이블 잠금의 문제를 해결하도록하십시오.MyISAM
은 동시 삽입을 지원하고 있습니다. 테이블의 데이터 파일 중간에 빈 블록이 없으면 다른 스레드가 테이블에서 읽을 것과 동시에 새로운 행을 거기에INSERT
할 수 있습니다. 이를 수행 할 수있는 것이 중요한 경우 행 삭제를 피하기 위해 테이블을 사용하는 것을 고려하십시오. 또 다른 가능성은 테이블의 많은 행을 삭제 한 후에OPTIMIZE TABLE
을 실행하여 테이블을 조각하는 것입니다. 이 동작은concurrent_insert
변수의 설정에 따라 변경됩니다. 행을 삭제 한 테이블에 새로운 행을 강제로 추가 (따라서 동시 삽입을 허용) 할 수 있습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.ARCHIVE
테이블에서 발생한 데이터 압축 문제를 해결하려면OPTIMIZE TABLE
을 사용할 수 있습니다. 섹션 15.5 "ARCHIVE 저장 엔진" 을 참조하십시오.일반적
의 순서로 행을 검색하려면expr1
、expr2
、...ALTER TABLE ... ORDER BY
을 사용합니다. 테이블을 크게 변경 한 후이 옵션을 사용하여 성능을 향상시킬 수 있습니다.expr1
,expr2
, ...경우에 따라 다른 컬럼의 정보에 따라 '해시 된'컬럼을 도입하는 것이 도움이 될 수 있습니다. 이 컬럼이 짧아 충분히 고유 인덱스가 설정되어있는 경우, 다수의 컬럼에 '광대'인덱스를 사용하는 것보다 훨씬 더 빨리 할 수 있습니다. MySQL에서는이 추가 컬럼을 매우 쉽게 사용할 수 있습니다.
SELECT * FROM
tbl_name
WHEREhash_col
= MD5 (CONCAT (col1
,col2
)) ANDcol1
= 'constant
'ANDcol2
= 'constant
';자주 변경되는
MyISAM
테이블에서는 모든 가변 길이 컬럼 (VARCHAR
,TEXT
및BLOB
)를 피하도록합니다. 테이블에 하나만 가변 길이 컬럼이 포함되지 않은 경우에도 테이블은 동적 행 형식을 사용합니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.일반적으로 행이 커지기 때문에 만에 하나의 테이블을 다른 테이블로 분할하는 것은 도움이되지 않습니다. 행에 대한 액세스에서 가장 크고 성능에 타격을주는 것은 행의 첫 번째 바이트를 찾는 데 필요한 디스크 검색입니다. 데이터가 발견 된 후에는 대부분의 최신 디스크에서 대부분의 응용 프로그램에 충분한 속도로 행 전체를 읽을 수 있습니다. 테이블을 분할 할 상당한 차이를 가져올 상황은 고정 행 크기 변경 가능한 동적 행 형식을 사용하는
MyISAM
테이블의 경우 또는 테이블을 현저하게 자주 검사해야하지만, 대부분 열은 필요하지 않은 경우뿐입니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.여러 줄의 정보를 바탕으로 계산 등 결과를 자주 계산할 필요가있는 경우, 새로운 테이블을 도입하여 실시간으로 카운터를 업데이트하는 것이 바람직 할 수 있습니다. 다음과 같은 형식의 업데이트는 매우 빠릅니다.
UPDATE
tbl_name
SETcount_col
=count_col
+ 1 WHEREkey_col
=constant
;이것은 테이블 수준 잠금 (단일 라이터와 여러 리더) 밖에없는
MyISAM
과 같은 MySQL 스토리지 엔진을 사용하는 경우에 매우 중요합니다. 또한이 경우 행 잠금 관리자가 수행해야하는 것은 적기 때문에 대부분의 데이터베이스 시스템에서 성능이 향상됩니다.큰 로그 테이블에서 통계를 수집 할 필요가있는 경우에는 로그 테이블 전체를 스캔하는 것이 아니라, 요약 테이블을 사용합니다. 요약의 관리는 "라이브"에서 통계를 계산하려고하는 경우보다 훨씬 빠를 것입니다. 상황이 달라졌다 (비즈니스 결정에 따라) 경우 로그에서 새로운 요약 테이블을 다시 생성하는 것이 실행중인 응용 프로그램을 수정하는 것보다 빠릅니다.
가능하면 통계 보고서에 필요한 데이터가 실시간 데이터를 정기적으로 생성 된 요약 테이블에서만 생성되는 '라이브'또는 '통계'로 보고서를 분류합니다.
열에 기본값이있는 것을 이용합니다. 삽입 값이 기본값과 다른 경우에만 명시 적으로 값을 삽입합니다. 이렇게하면 MySQL이 실행해야하는 분석이 줄어들고 삽입 속도가 향상됩니다.
상황에 따라 데이터를
BLOB
컬럼에 팩을 저장하면 편리합니다. 이 경우 정보를 팩 및 unpack하는 코드를 애플리케이션에 추가 할 필요가 있지만, 이는 특정 단계에서 대량의 액세스를 생략 할 수 있습니다. 이것은 행과 열의 테이블 구조에 잘 따르지 않는 데이터가있는 경우에 실용적입니다.일반적으로 모든 데이터를 중복으로 유지하려고합니다 (데이터베이스 이론에서 제 3 정규형라는 것을 준수합니다). 그러나 고속화를 도모하기 위하여 정보를 복제하거나 요약 테이블을 만들 수 유리할 상황도 있습니다.
스토어드 루틴 및 UDF (사용자 정의 함수)는 특정 작업에서 성능 향상에 적절한 방법 일 수 있습니다. 자세한 내용은 섹션 20.2 "스토어드 루틴 (프로 시저 및 함수) 사용" 및 섹션 24.3 "MySQL에 새로운 기능 추가" 를 참조하십시오.
응용 프로그램에서 쿼리 및 응답을 캐시에서 많은 삽입이나 업데이트를 한꺼번에 실행하여 성능을 향상시킬 수 있습니다. 데이터베이스 시스템에서 MySQL과 같이 테이블 잠금을 지원하는 경우, 이것은 모든 업데이트 후에 인덱스 캐쉬가 1 회만 플래시되도록하는 데 도움이됩니다. 비슷한 결과를 얻으려면 MySQL 쿼리 캐시를 이용 할 수 있습니다. 섹션 8.9.3 "MySQL 쿼리 캐시" 를 참조하십시오.
하나의 SQL 문에서 많은 행을 저장하려면 여러 행의
INSERT
문을 사용합니다. (이것은 상대적으로 포팅 가능한 기술입니다.)대량의 데이터를로드하려면
LOAD DATA INFILE
을 사용합니다. 이것은INSERT
문을 사용하는 것보다 속도가 빨라집니다.테이블의 각 행을 하나의 고유 값으로 식별 할 수 있도록
AUTO_INCREMENT
컬럼을 사용합니다.가끔
OPTIMIZE TABLE
을 사용하여 동적 형식의MyISAM
테이블에 의한 단편화를 방지합니다. 섹션 15.2.3 "MyISAM 테이블 스토리지 포맷" 을 참조하십시오.가능하면
MEMORY
테이블을 사용하여 고속화를 도모합니다. 섹션 15.3 "MEMORY 스토리지 엔진" 을 참조하십시오. Web 브라우저에서 Cookie가 활성화되어 있지 않은 사용자에게 마지막에 표시된 배너 정보 등 자주 사용되는 중요하지 않은 데이터는MEMORY
테이블이 도움이됩니다. 사용자 세션도 휘발성 상태 데이터를 처리하기 위해 많은 Web 어플리케이션 환경에서 사용할 수있는 또 하나의 대안입니다.Web 서버는 이미지와 기타 이진 자산이 일반적으로 파일로 저장되는 것입니다. 즉, 데이터베이스는 파일 자체가 아니라 파일에 대한 참조 만 포함합니다. 대부분의 Web 서버는 데이터베이스 내용보다는 파일의 캐쉬가 뛰어 나기 때문에 파일의 사용은 일반적으로 빠릅니다.
해당 컬럼에 기초한 결합이 빨리되도록 다른 테이블에서 동일한 정보를 가지는 컬럼은 동일한 데이터 형식을 갖도록 선언해야합니다.
컬럼 이름이 쉽게되도록합니다. 예를 들어,
customer
라는 테이블에서는customer_name
대신name
컬럼 이름을 사용합니다. 이름을 다른 SQL 서버에 이식 할 수 있도록하기 위해 18 자보다 짧게하는 것을 고려합니다.실제로 고속화가 필요한 경우 다른 SQL 서버가 지원하는 데이터 스토리지의 저레벨 인터페이스를 조사합니다. 예를 들어, MySQL
MyISAM
스토리지 엔진에 직접 액세스하여 SQL 인터페이스를 사용하는 경우에 비해 2 배에서 5 배의 속도 향상을 얻을 수있을 수 있습니다. 이를 실행하려면 데이터가 응용 프로그램과 동일한 서버에 있어야 보통 1 프로세스에서만 액세스하도록하십시오 (외부 파일 잠금은 매우 느리기 때문에). 이러한 문제는 MySQL 서버에 저레벨의MyISAM
명령을 도입하는 것으로 해소 할 수 있습니다 (이것이 필요한 성능을 향상시키는 하나의 쉬운 방법입니다). 데이터베이스 인터페이스를 신중하게 설계하는 것으로, 이런 종류의 최적화를 매우 쉽게 지원할 수 있어야합니다.숫자 데이터를 사용하는 경우 많은 경우에 텍스트 파일에 액세스하는 것보다 라이브 연결을 사용하여 데이터베이스에서 정보에 액세스하는 것이 빠릅니다. 데이터베이스의 정보는 텍스트 파일보다 컴팩트 한 포맷으로 저장 될 가능성이 높기 때문에 그것에 접근을 위협하는 디스크 액세스가 줄어 듭니다. 또한 텍스트 파일을 분석하여 행과 열의 경계를 찾을 필요가 없기 때문에 응용 프로그램의 코드도 절약 할 수 있습니다.
복제는 특정 작업에서 성능 향상을 얻을 수 있습니다. 클라이언트의 취득을 복제 서버로 분산하여 부하를 나눌 수 있습니다. 백업하는 동안 마스터의 속도 저하를 방지하기 위해 슬레이브 서버를 사용하여 백업을 만들 수 있습니다. 제 17 장 "복제" 를 참조하십시오.
DELAY_KEY_WRITE=1
테이블 옵션을 사용하여MyISAM
테이블을 선언하면 테이블이 닫힐 때까지 디스크에 플러시되지 않기 때문에 인덱스의 업데이트가 빨라집니다. 단점은 이러한 테이블이 열려있는 동안 무언가에 의해 서버가 강제 종료 된 경우--myisam-recover-options
옵션을 사용하여 서버를 실행하거나 서버를 다시 시작 전에 myisamchk를 실행하여 테이블이 문제가 없음을 확인해야하는 것입니다. (단,이 경우에도 키 정보는 항상 데이터 행에서 생성 할 수 있기 때문에DELAY_KEY_WRITE
를 사용해도 아무것도 잃지 않는 것입니다.)SELECT
문 우선 순위를 삽입 높이려면 지원되는 비 트랜잭션 테이블에INSERT LOW_PRIORITY
를 사용합니다.큐에 끼어 먼저 검색되도록하려면 지원되는 비 트랜잭션 테이블에
SELECT HIGH_PRIORITY
를 사용합니다. 즉, 쓰기의 실행을 대기하고있는 다른 클라이언트가있는 경우SELECT
가 실행됩니다.LOW_PRIORITY
과HIGH_PRIORITY
는 테이블 수준의 잠금 만 사용하는 비 트랜잭션 스토리지 엔진에만 효과가 있습니다.