8.4.3.1 MySQL에서 테이블 열고 닫는 방법
mysqladmin status 명령을 실행하면 다음과 같이 표시되어야합니다.
Uptime : 426 Running threads : 1 Questions : 11082 Reloads : 1 Open tables : 12
테이블이 6 개 밖에없는 경우 12 Open tables
값은 다소 기괴하게 생각할 수 있습니다.
MySQL은 멀티 스레드이기 때문에 특정 테이블에 대해 많은 클라이언트가 동시에 쿼리를 발행하는 경우가 있습니다. 같은 테이블에 여러 클라이언트 세션이 다른 상태를 가지는 문제를 최소화하기 위해 테이블은 각 동시 세션에 독립적으로 열립니다. 이것은 추가 메모리를 사용하지만 일반적으로 성능은 향상됩니다. MyISAM
테이블에서는 테이블을 열려있는 클라이언트에 대한 데이터 파일에 1 개의 추가 파일 디스크립터가 필요합니다. (반대로 인덱스 파일 디스크립터는 모든 세션에서 공유됩니다.)
table_open_cache
및 max_connections
시스템 변수는 서버가 열린 상태로 유지하는 파일의 최대 수에 영향을줍니다. 이러한 값 중 하나 또는 모두를 늘리면 오픈 파일 디스크립터의 프로세스 당 몇 대해 운영 체제에서 적용되는 제한에 도달 할 수 있습니다. 많은 운영 체제에서는 오픈 파일 제한을 늘릴 수 있지만 방법은 시스템에 따라 크게 다릅니다. 제한을 늘릴 수 있는지 여부 및 그 실행 방법은 사용하는 운영 체제 설명서를 참조하십시오.
table_open_cache
는 max_connections
에 관련합니다. 예를 들어, 200 동시 연결의 경우 적어도 200 *
테이블 캐시 크기를 지정합니다. 여기서 N
N
은 실행 쿼리의 결합 당 테이블의 최대 수입니다. 또한 임시 테이블과 파일에 대한 몇 가지 추가적인 파일 디스크립터를 예약해야합니다.
운영 체제에서 table_open_cache
설정에 나타난 오픈 파일 디스크립터의 수를 처리 할 수 있는지 확인하십시오. table_open_cache
설정이 너무 크면 MySQL이 파일 기술자를 다 써 버려 접속을 거부하고 쿼리의 실행에 실패하여 신뢰성이 크게 저하됩니다. 또한 MyISAM
스토리지 엔진은 고유의 오픈 테이블마다 2 개의 파일 디스크립터가 필요하다는 것도 고려할 필요가 있습니다. mysqld에 --open-files-limit
시작 옵션을 사용하면 MySQL에서 사용할 수있는 파일 디스크립터의 수를 늘릴 수 있습니다. 섹션 B.5.2.18 " 'File'를 찾을 수 없습니다, 그리고 같은 오류" 를 참조하십시오.
오픈 테이블의 캐쉬는 table_open_cache
항목 수준에서 유지됩니다. 서버는 시작시 캐시 크기를 자동 크기 설정합니다. 크기를 명시 적으로 설정하려면 시작시 table_open_cache
시스템 변수를 설정합니다. MySQL은 쿼리를 실행하기 위해 일시적으로 더 많은 테이블을 열 수 있습니다.
다음과 같은 상황에서는 MySQL은 사용하지 않는 테이블을 닫고 그것을 테이블 캐시에서 제거합니다.
캐시가 가득 스레드가 캐시에없는 테이블을 열려고했을 경우.
캐시에
table_open_cache
이상의 항목이 캐시 테이블이 어떤 스레드에 의해 사용되지 않는 경우.테이블 플래시 작업이 수행 된 경우. 이것은 누군가가
FLUSH TABLES
문을 실행하거나 mysqladmin flush-tables 또는 mysqladmin refresh 명령을 실행 한 경우에 발생합니다.
테이블 캐쉬가 꽉 차면 서버는 다음과 같이 사용하는 캐시 항목을 찾습니다.
현재 사용하지 않는 테이블은 가장 오랫동안 사용되지 않은 테이블에서 해방됩니다.
새로운 테이블을 열어야하지만 캐시가 가득 해방있는 테이블이없는 경우, 필요에 따라서 캐쉬가 일시적으로 확장됩니다. 캐시가 일시적으로 확장 된 상황에서 테이블이 사용 중 사용하지 않는 상태가 된 때에는 그 테이블이 닫히고 캐시에서 해방됩니다.
MyISAM
테이블은 동시 액세스마다 열립니다. 즉, 2 개의 thread로 같은 테이블에 액세스하거나 하나의 스레드가 동일한 쿼리에서 테이블에 두번 접근하면 (테이블 자체에 결합해서 등)는 테이블을 2 회 열 필요가있다 것을 의미합니다. 동시 오픈은 각각 테이블 캐시에 항목이 필요합니다. 하나의 MyISAM
테이블을 처음 열면 데이터 파일에 하나 인덱스 파일에 1 개의 2 개의 파일 디스크립터가 필요합니다. 테이블의 추가 사용은 각 데이터 파일에 하나의 파일 디스크립터가 필요합니다. 인덱스 파일 디스크립터는 모든 스레드에서 공유됩니다.
HANDLER
문을 사용하여 테이블을 열 경우 전용 테이블 객체가 스레드에 할당됩니다. 이 테이블 오브젝트는 다른 thread와 공유되지 않고 쓰레드가 tbl_name
OPENHANDLER
를 호출하거나 스레드가 종료 될 때까지 청산되지 않습니다. 이것이 발생하면 테이블이 테이블 캐쉬에 되돌려집니다 (캐쉬가 가득 않은 경우). 섹션 13.2.4 "HANDLER 구문" 을 참조하십시오. tbl_name
CLOSE
테이블 캐시가 너무 작은 여부는 mysqld의 상태 변수 Opened_tables
을 체크하고 확인할 수 있습니다. 이것은 서버가 시작된 이후의 테이블 열기 작업의 수를 나타냅니다.
mysql> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
많은 FLUSH TABLES
명령문을 발행하지 않은 경우에도 값이 매우 크거나 급증하면 테이블 캐시 크기를 늘립니다. 섹션 5.1 "서버 시스템 변수" 및 섹션 5.1.6 "서버 상태 변수" 를 참조하십시오.