innodb_buffer_pool을 설정하고 왜 ..?


20

170GB의 InnoDB인덱스와 데이터가 있습니다.

성능 향상을 위해 innodb_buffer_pool 크기를 다시 조정해야합니다 .InnoDB 테이블 (Index + data)의 최대 테이블 크기는 28GB입니다.

따라서 innodb_buffer_pool의 최적 크기는 얼마입니까?

최신 정보

우리는이 로컬 데이터베이스를 ec2로 마이그레이션 할 것이므로 innodb의 현재 통계에 따라 RAM을 설정하므로 버퍼 풀의 크기가 필요하므로 사용 가능한 RAM을 가질 수 있습니다.

파일 당 테이블이 사용 가능합니다.

Linux 컴퓨터를 사용하고 있습니다.


다른 프로세스에서 사용하지 않는 머신에서 사용 가능한 RAM은 무엇입니까? Windows, Linux 또는 다른 것을 사용하고 있습니까? 어떤 버전의 MySQL을 사용하고 있습니까? 테이블 크기가 28GB로 제한되는 이유는 무엇입니까?
Craig Efrein 2016 년

테이블 크기는 제한되지 않습니다. 테이블의 크기를 한 시점까지 부여했습니다. 앞으로 삽입이있을수록 증가 할 것입니다.
Abdul Manaf

답변:


25

가장 큰 테이블은 총 데이터의 16.47 % (28/170)를 구성합니다. 테이블이 많이 쓰여지고 읽히더라도, 테이블의 모든 28G가 주어진 순간에 버퍼 풀에로드되는 것은 아닙니다. 계산해야 할 것은 현재 DB 서버에 주어진 순간에 얼마나 많은 InnoDB 버퍼 풀이로드되는지 입니다.

다음은 현재 DB 서버의 InnoDB 버퍼 풀에 현재로드 된 데이터 세트가 제공된 경우 새 DB 서버의 innodb_buffer_pool_size를 결정하는보다 세부적인 방법입니다.

현재 MySQL 인스턴스 (이주중인 서버)에서 다음을 실행하십시오.

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

수식을 실행하십시오 IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

IBPPctFull이 95 % 이상이면 innodb_buffer_pool_size를 DB 서버 RAM의 75 %로 설정해야합니다.

IBPPctFull이 95 % 미만인 경우 다음 공식을 실행하십시오 IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05..

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

IBPSize의 숫자 (GB)는 실제 작업 데이터 세트에 더 가까운 숫자입니다.

이제 IBPSize가 여전히 가장 큰 Amazon EC2 RAM 구성에 비해 너무 큰 경우 Amazon EC2 DB 서버에 RAM의 75 %를 사용하십시오.


MySQL 서버가 버퍼 풀에서 데이터와 인덱스를로드하는 방법을 알아야합니다. 문서를 살펴보고 LRU를 사용하지만 2GB가있는 것처럼 메모리에로드하는 방법을 알아야합니다. 버퍼 풀이지만 쿼리에서 요청한 테이블 크기는 그 이상입니다 .. ??
압둘 마나프

쿼리를 충족시키는 데 필요한 데이터 및 인덱스 페이지 만 전체 테이블이 아닌 버퍼 풀에로드됩니다. 오래된 데이터와 인덱스 페이지는에 나와있는 LRU 알고리즘을 기반으로 밖으로 회전 dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html
RolandoMySQLDBA

압둘, 당신은 내 질문보다 당신의 질문에 더 잘 맞는 롤란도의 대답으로 가야합니다. 나는 더 명확해야하기 때문에 내 자신의 대답을 다시 쓸 것입니다.
Craig Efrein

13

이 답변을 아래의 Rolando 답변에 대한 보완 정보로 제공하고 있습니다.

서버가 생산되기 전에

MySQL에서 가장 자주 사용하는 가장 큰 테이블을 기반으로 innodb_buffer_pool_size를 계산하십시오. 데이터베이스에서 크기에 따라 가장 큰 테이블을 식별하기 위해이 스크립트를 사용할 수 있습니다.

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

데이터베이스에서 가장 큰 테이블을 알았으므로 가장 자주 사용되는 테이블을 결정해야합니다. 이를 위해 Jet Profiler (JP)와 같은 프로파일 링 프로그램을 사용하여 가장 많이 액세스되는 테이블을 확인합니다. JP는 가장 자주 액세스하는 테이블을 보여줍니다. 다음은 JP에서 해당 섹션의 스크린 샷입니다.

여기에 이미지 설명을 입력하십시오

따라서이를 염두에두고 사용자 및 입찰 테이블은 약 640MB의 디스크 공간을 차지한다는 점을 알고 있습니다 .JP에 따라 매우 자주 사용되므로 MySQL은 인덱스와 데이터를 Rolando와 같은 버퍼 풀에 저장합니다. 그의 의견에 아래 언급.

MySQL에 가장 크고 가장 많이 사용되는 테이블에 대한 데이터를 저장하기에 충분한 메모리가 있는지 확인하기 위해 640MB에서 innodb_buffer_pool_size를 정의합니다.

몇 가지 추가 고려 사항이 있지만 innodb_buffer_pool_size에는 적용되지 않습니다.

이것이 32 비트 또는 64 비트 시스템입니까? 32 비트 시스템에서 PAE를 활성화하지 않으면 4GB로 제한됩니다. Windows에서 이는 Windows Enterprise 또는 Datacenter 에디션을 실행하는 것을 의미합니다.

시스템에서 실행중인 다른 프로세스에 얼마나 많은 메모리가 필요합니까? 전용 MySQL 서버에서는 OS에 대해 5 %에서 10 % 사이를 유지합니다. Windows에서는 프로세스 탐색기를 사용하여 메모리 사용량을 분석 할 수 있습니다. Linux에는 sysstat, free, htop, top 및 vmstat가 있습니다.

데이터베이스는 Innodb 테이블로만 구성되거나 Innodb와 MyISAM이 혼합되어 있습니까? 이 둘이 혼합 된 경우 key_cache, 조인 변수, 쿼리 캐시 등의 메모리를 따로 보관 해 두겠습니다. 나중에 서버가 프로덕션 환경에 있으면 MyISAM 적중률을 계산할 수 있습니다.

서버가 생산 된 후

Innodb의 현재 적중률은 얼마입니까?

1-(innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

키 캐시 적중률은 무엇입니까

1-(키 읽기 / 키 읽기 요청)

나는 일반적으로 가능한 한 100 %에 가까운 비율을 얻으려고 노력합니다.

테이블이 버퍼 풀에 얼마나 잘 맞습니까?

또한이 링크를 참조하여 테이블 데이터가 buffer_pool에 얼마나 잘 맞는지 확인할 수 있습니다.이 링크를 통해 "주어진 테이블에 대한 버퍼 풀에있는 페이지 수 (cnt), 더러워진 페이지 수 (더러운 수)"를 표시 할 수 있습니다. , 메모리에 맞는 인덱스 비율은 얼마입니까 (fit_pct). " Percona 서버에만 적용

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.