8.6.1 MyISAM 쿼리 최적화
MyISAM
테이블 쿼리 속도를위한 몇 가지 일반적인 팁 :
MySQL이 쿼리를보다 효율적으로 최적화 할 수 있도록하려면 테이블에 데이터가로드 된 후에 그것에 대해
ANALYZE TABLE
을 사용하거나 myisamchk --analyze를 실행합니다. 이렇게하면 동일한 값이 평균 행 수를 나타내는 각 인덱스 파트의 값을 업데이트합니다. (고유 인덱스의 경우, 이것은 항상 1입니다.) MySQL은 이것을 사용하여 비 상수 식에 따라 두 개의 테이블을 조인 할 때 선택하는 인덱스를 결정합니다.SHOW INDEX FROM
을 사용하고tbl_name
Cardinality
값을 조사하여 테이블 분석 결과를 확인할 수 있습니다. myisamchk --description --verbose는 인덱스의 분포 정보를 보여줍니다.인덱스에 따라 인덱스와 데이터를 정렬하려면 myisamchk --sort-index --sort-records = 1을 사용합니다 (인덱스 1에 정렬한다고 가정하고). 인덱스에 따라 순차적으로 모든 행을 읽어하고자하는 고유 인덱스가있는 경우, 이것은 쿼리를 빠르게하는 적절한 방법입니다. 이 방법으로 큰 테이블을 처음으로 정렬 할 때 시간이 오래 걸릴 수 있습니다.
자주 업데이트되는
MyISAM
테이블에 대한 복잡한SELECT
쿼리를 피하고 리더와 라이터의 충돌로 인해 발생하는 테이블 잠금의 문제를 해결하도록하십시오.MyISAM
은 동시 삽입을 지원하고 있습니다. 테이블의 데이터 파일 중간에 빈 블록이 없으면 다른 스레드가 테이블에서 읽을 것과 동시에 새로운 행을 거기에INSERT
할 수 있습니다. 이를 수행 할 수있는 것이 중요한 경우 행 삭제를 피하기 위해 테이블을 사용하는 것을 고려하십시오. 또 다른 가능성은 테이블의 많은 행을 삭제 한 후에OPTIMIZE TABLE
을 실행하여 테이블을 조각하는 것입니다. 이 동작은concurrent_insert
변수의 설정에 따라 변경됩니다. 행을 삭제 한 테이블에 새로운 행을 강제로 추가 (따라서 동시 삽입을 허용) 할 수 있습니다. 섹션 8.10.3 "동시 삽입" 을 참조하십시오.자주 변경되는
MyISAM
테이블에서는 모든 가변 길이 컬럼 (VARCHAR
,TEXT
및BLOB
)를 피하도록합니다. 테이블에 하나만 가변 길이 컬럼이 포함되지 않은 경우에도 테이블은 동적 행 형식을 사용합니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.일반적으로 행이 커지기 때문에 만에 하나의 테이블을 다른 테이블로 분할하는 것은 도움이되지 않습니다. 행에 대한 액세스에서 가장 크고 성능에 타격을주는 것은 행의 첫 번째 바이트를 찾는 데 필요한 디스크 검색입니다. 데이터가 발견 된 후에는 대부분의 최신 디스크에서 대부분의 응용 프로그램에 충분한 속도로 행 전체를 읽을 수 있습니다. 테이블을 분할 할 상당한 차이를 가져올 상황은 고정 행 크기 변경 가능한 동적 행 형식을 사용하는
MyISAM
테이블의 경우 또는 테이블을 현저하게 자주 검사해야하지만, 대부분 열은 필요하지 않은 경우뿐입니다. 제 15 장 "대체 스토리지 엔진" 을 참조하십시오.일반적
의 순서로 행을 검색하려면expr1
、expr2
、...ALTER TABLE ... ORDER BY
을 사용합니다. 테이블을 크게 변경 한 후이 옵션을 사용하여 성능을 향상시킬 수 있습니다.expr1
,expr2
, ...여러 줄의 정보를 바탕으로 계산 등 결과를 자주 계산할 필요가있는 경우, 새로운 테이블을 도입하여 실시간으로 카운터를 업데이트하는 것이 바람직 할 수 있습니다. 다음과 같은 형식의 업데이트는 매우 빠릅니다.
UPDATE
tbl_name
SETcount_col
=count_col
+ 1 WHEREkey_col
=constant
;이것은 테이블 수준 잠금 (단일 라이터와 여러 리더) 밖에없는
MyISAM
과 같은 MySQL 스토리지 엔진을 사용하는 경우에 매우 중요합니다. 또한이 경우 행 잠금 관리자가 수행해야하는 것은 적기 때문에 대부분의 데이터베이스 시스템에서 성능이 향상됩니다.데이터가 기록되는시기를 알 필요가없는 경우에는
MyISAM
(또는 기타 지원되는 비 트랜잭션 테이블)에INSERT DELAYED
를 사용합니다. 많은 행을 1 개의 디스크 쓰기로 쓸 수 있기 때문에이를 통해 삽입의 전체 영향이 적습니다.참고MySQL 5.6.6 현재
INSERT DELAYED
는 사용되지 않으며 이후 릴리스에서 제거됩니다. 대신INSERT
(DELAYED
를 붙이지 않는)을 사용하십시오.정기적으로
OPTIMIZE TABLE
을 사용하여 동적 포맷MyISAM
테이블의 조각화를 방지합니다. 섹션 15.2.3 "MyISAM 테이블 스토리지 포맷" 을 참조하십시오.DELAY_KEY_WRITE=1
테이블 옵션을 사용하여MyISAM
테이블을 선언하면 테이블이 닫힐 때까지 디스크에 플러시되지 않기 때문에 인덱스의 업데이트가 빨라집니다. 단점은 이러한 테이블이 열려있는 동안 무언가에 의해 서버가 강제 종료 된 경우--myisam-recover-options
옵션을 사용하여 서버를 실행하거나 서버를 다시 시작 전에 myisamchk를 실행하여 테이블이 문제가 없음을 확인해야하는 것입니다. (단,이 경우에도 키 정보는 항상 데이터 행에서 생성 할 수 있기 때문에DELAY_KEY_WRITE
를 사용해도 아무것도 잃지 않는 것입니다.)MyISAM
인덱스는 문자열의 앞뒤에 공백이 자동으로 압축됩니다. 섹션 13.1.13 "CREATE INDEX 구문" 을 참조하십시오.응용 프로그램에서 쿼리 및 응답을 캐시에서 많은 삽입이나 업데이트를 한꺼번에 실행하여 성능을 향상시킬 수 있습니다. 이 작업 중에 테이블을 잠금하여 모든 업데이트 후에 인덱스 캐쉬가 1 회만 플래시됩니다. 비슷한 결과를 얻으려면 MySQL 쿼리 캐시를 이용 할 수 있습니다. 섹션 8.9.3 "MySQL 쿼리 캐시" 를 참조하십시오.