8.6.1 MyISAM 쿼리 최적화
MyISAM 테이블 쿼리 속도를위한 몇 가지 일반적인 팁 :
MySQL이 쿼리를보다 효율적으로 최적화 할 수 있도록하려면 테이블에 데이터가로드 된 후에 그것에 대해
ANALYZE TABLE을 사용하거나 myisamchk --analyze를 실행합니다. 이렇게하면 동일한 값이 평균 행 수를 나타내는 각 인덱스 파트의 값을 업데이트합니다. (고유 인덱스의 경우, 이것은 항상 1입니다.) MySQL은 이것을 사용하여 비 상수 식에 따라 두 개의 테이블을 조인 할 때 선택하는 인덱스를 결정합니다.SHOW INDEX FROM을 사용하고tbl_nameCardinality값을 조사하여 테이블 분석 결과를 확인할 수 있습니다. 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, ...여러 줄의 정보를 바탕으로 계산 등 결과를 자주 계산할 필요가있는 경우, 새로운 테이블을 도입하여 실시간으로 카운터를 업데이트하는 것이 바람직 할 수 있습니다. 다음과 같은 형식의 업데이트는 매우 빠릅니다.
UPDATEtbl_nameSETcount_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 쿼리 캐시" 를 참조하십시오.