読者です 読者をやめる 読者になる 読者になる

技術部

プログラミングのことが中心

MySQLのストレージんエンジン

ストレージエンジン(データベースエンジン)

データベース管理システム(DBMS)がデータベースに対してデータの生成、読み取り、更新及び削除する機能のコンポーネント

MySQLのデフォルトストレージエンジンはinnoDB

ストレージエンジンの役割

ストレージエンジンの動作

  1. データベースエンジンがクライアントからSQL文を受け取ると、「“SELECT文”なのか“UPDATE文”なのか、どんな条件式がついているのか」などを把握するためにまずそのSQL文の解釈を行います。これをSQL文のパースと呼びます。
  2. 次にデータの処理方法を決める。プランナやオプティマイザと呼ぶ機能がこの仕事を行います。
  3. データの処理方法が決まると、はじめて実データへのアクセス処理が開始。実データがどのような形式で、ディスク上にどのように格納されているかといった情報が必要になる。ここが、ストレージエンジン部にになる

ストレージエンジンはテーブル単位

MySQLのストレージエンジンは、テーブル単位で指定することが可能。具体的には、CREATE TABLE文にてテーブルを作成する時にENGINE句にて、使用したいストレージエンジン名を指定する。

InnoDBの8KBの壁

デフォルトのMySQLでは、InnoDBの1行はデータ量8KB以下にしなければならない

8KBは何処から出てきた数値!?!?

ページサイズの半分。InnoDBではデフォルトのページサイズが16KBになっていて、その半分だから8KB>

  • ページとは?
InnoDBがディスク (データファイル) とメモリー (バッファープール) 間で一度に転送するデータ量を表す単位。

参考資料

問題と原因

問題

InnoDBでは8KBを超えた行を操作するとエラーになる

原因

可変長(text,varchar)の文字列型に値を入れると先頭768バイトだけローカルに保持して残りは外部のページに保持する。

参考資料

計算してみると?

8000バイト÷768バイト=約10.42

と以上から、可変長のカラムのうち11カラム以上に値が入ると8KBを越える。。。。。

対応方法

  • ROW_FORMATをDYNAMICに変更する。。。

    defaultでは、compact

ROW_FORMAT=DYNAMICを利用するにはInnoDB自体のファイルフォーマットをBarracudaに設定する必要があるので注意

  • innoDBinnodb_file_formatを AntelopからBarracudaへと変更する。。。

    ファイルフォーマットをBarracudaにするにはmy.cnfの設定を変更し、MySQLを再起動

ちなみに。。。

Rails(ActiveRecord)とMySQLでutf8mb4を扱う際にも上記のような設定を行うことで可能となる。