ストレージエンジン
ストレージエンジンとは?
- プランナ、オプティマイザ
- SQL文のパースが終わった後、次にデータをどのように処理するかを決める機能。
- インデックスの有無、テーブルの接合方法を決定する。
- explainがやってるのはオプティマイザの処理のdumpと考えればよい?
- データの処理方法が決まり、実データがどのように格納されているかを扱う部分がストレージエンジン部。
よく聞くMyISAMとInnoDBって?
- MySQL≒Pluggable Storage Engine Architecture(ストレージエンジンを抜き差しできるアーキテクチャ)。
- MySQLではtableごとにストレージエンジンを選択することが可能。
MyISAM
- テーブル単位のファイルによるデータ構造を持ち、トランザクション機能をサポートしていない。
- テーブル単位で何件データを保持しているか、内部で持ってる。(⇔InnoDBは...)
- テーブルスキャンの速度が早い。
InnoDB
- テーブルスペース内に複数のテーブルやインデックスを格納するデータ構造を持ち、トランザクション機能をサポートしている。
- 障害発生時にデータ損失がない(ACID準拠なら)
- ホットバックアップ(サーバ無停止で完全なバックアップ)が可能⇔MyISAMは...
- 行ロックができるのはInnoDBの方。(同時並列処理性能がこれで高くなる!)
カーディナリティについて
- データのバラツキ度合いの指標。直訳すると「濃度」のこと。
- カーディナリティが大きい=データのバラツキ度合いが大きい≒データがユニーク
- ex) 性別はカーディナリティがとても低い
- カーディナリティが低いときはindexを使わず上から舐めていく。
インデックスについて
- InnoDBにはPRIMARY KEY, SECONDARY KEY(KEY)の2種類が存在。
PRIMARY KEY
- 1テーブルに1つしか存在しないKEY
- リレーショナルモデルの一意制約を守るためにある
- 集合モデルのため、同じ要素が2つあってはいけない
- PRIMARY KEYを指定しない場合でも、暗黙的な隠しカラムが作られる
- InnoDBはprimary keyがデータそのもの(クラスターインデックス)
- データ自体がインデックスに含まれる
SECONDARY KEY
- 複数作成可能
- ノンクラスターインデックス
- インデックスを辿ってくとデータ(primary key)へのリファラがある。
- リーフノードにデータを持たないということは...
- データを探すときにSECONDARY KEY->PRIMARY KEYの複数のIOが走る
- primary keyによる検索より時間がかかる
- 負荷もかかる
- ノンクラスターインデックスの中にprimary keyを持つ
- primary keyのサイズが大きいと、KEYのサイズが膨らむ
- データを探すときにSECONDARY KEY->PRIMARY KEYの複数のIOが走る
KEYの構造は、どちらもB+tree構造
- B木についてはまた後程...
- 合わせて読みたい。
- http://qiita.com/kiyodori/items/f66a545a47dc59dd8839