MySQLの基本
Inno DBの仕組み
Inno DBはB+ Treeを採用している
B Treeを改善したやつ
簡単に言うと二分探索アルゴリズム
B+ TreeはB Treeと異なる点
1. リーフノードに実データがある
2. リーフノード間はつながっている
https://image.itmedia.co.jp/ait/articles/0501/18/r12fig_03.gif
こちらでINSERTとSELECTの場合にノードの辿り方をアニメーションで確認できる クラスタインデックス
Inno DBの主キー(Primary key)はクラスタ化インデックス
PRIMARY KEYがあるとそれがクラスタインデックスとして使われる
PRIMARY KEYがない場合、NOT NULLのUNIQUEがクラスタインデックスとして使われる
両方ない場合は、内部で行IDをクラスタインデックス(非表示のクラスタインデックス)として使用(つまり行IDでソートされる)
インデックスのカラム値を元にソートされている
リーフノードに全データが格納されているので、対象のリーフノードにたどり着いた時点でデータはフェッチ完了しているため検索速い
http://2.bp.blogspot.com/_3l-X4JQ1EX4/TKpt3auAJ1I/AAAAAAAAAd0/Hs4Oz4ASZtU/s1600/C:%5Cfakepath%5Cinnodb_clust_index.png
特定のカラムに貼るインデックスはセカンダリインデックス
ツリーを辿って主キーを取得し、主キーからさらにクラスタインデックスを辿るので1ステップ増える
http://4.bp.blogspot.com/_3l-X4JQ1EX4/TKpuV6PFlmI/AAAAAAAAAd4/-xSSBaFDU38/s1600/C:%5Cfakepath%5Cinnodb_second_index.png
非クラスタインデックス(TODO)
インデックスがつけられた列のデータ行へのポインタ
ソートはされない
COUNT()を扱う際の注意事項
count(*)は全レコードの行数を取得するだけど、count(col)はcolがnullじゃない行数の合計を取得する
count(*)とcount(1)の違いはない
セカンダリインデックスを付けるとcount(*)が速くなるがデメリットもある(詳細は文献を参照)
設定
ページャ
pagerを設定して、sqlの結果をpagerに書き出せる
結果は標準入力で渡されるので、そこだけ注意
code:sql
pager less -SFX // lessを使う
pager vim - // vimを使う
select * from animals;
nopagerでページャを使わないようにできる
文字コード
charasetで文字コードを指定できる
utf8は3バイトまでしか対応していないので、4バイトまで対応が必要なシステムはutf8mb4を使う必要がある
code:sql
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
文字コードを指定できる単位は色々あるが、すべてを同一にそろえておくのが無難
クライアント
サーバー
接続時
データベース
テーブル
カラム
コマンド
シェルでsql発行
code:sh
mysql -ugorilla -Dgorilla -p -e "select * from animals";
参考文献