この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

最適なバッファプールサイズを計算するSQL

StackOverflowでナイスな回答を見つけた。
以下、自分用メモとして要点をピックアップ。

http://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size


InnoDBの最適なバッファプールサイズを予想するには、まずこのSQLを実行する。

SELECT Ceiling(total_innodb_bytes * 1.6 / Power(1024, 3)) RIBPS 
FROM   (SELECT Sum(data_length + index_length) Total_InnoDB_Bytes 
        FROM   information_schema.tables 
        WHERE  engine = 'InnoDB') A; 

これは、現時点でInnoDBが使っているメモリの総量を1.6倍した数値。(GB単位)


次に、しばらく経ってから以下のSQLを実行する。

SELECT ( pagesdata * pagesize ) / Power(1024, 3) DataGB 
FROM   (SELECT variable_value PagesData 
        FROM   information_schema.global_status 
        WHERE  variable_name = 'Innodb_buffer_pool_pages_data') A, 
       (SELECT variable_value PageSize 
        FROM   information_schema.global_status 
        WHERE  variable_name = 'Innodb_page_size') B; 

これは、InnoDBのデータがどれだけバッファプールに乗っているかを計算した数値。(GB単位)
バッファプールを目一杯使っていなければメモリは足りていることになる。


微調整を繰り返したのち、最終的には、このSQLが示す推奨サイズを設定することでチューニングが完了する。

SELECT CONCAT(CEILING(RIBPS/POWER(1024,pw)),SUBSTR(' KMGT',pw+1,1))
Recommended_InnoDB_Buffer_Pool_Size FROM
(
    SELECT RIBPS,FLOOR(LOG(RIBPS)/LOG(1024)) pw
    FROM
    (
        SELECT SUM(data_length+index_length)*1.1*growth RIBPS
        FROM information_schema.tables AAA,
        (SELECT 1.25 growth) BBB
        WHERE ENGINE='InnoDB'
    ) AA
) A;

注意点

InnoDBは、実際に指定したバッファプールサイズの110%を使用することに注意。これは公式ドキュメントにも書いてある。
バッファ管理の作業エリアとして必要らしい。