この人の本はおすすめです!
https://www.shoeisha.co.jp/book/detail/9784798117034
これ家にある。
https://www.shoeisha.co.jp/book/article/detail/228
これ見て、軽くおさらい。
ディスクが遅い理由
・頭出し(シーク)
・回転待ち時間
→シーク完了後、目的のデータが回ってくるのを待つ時間。HDD回転速度に依存
・データ転送速度
→HDDの回転速度に依存
メモリとの性能の違い
・メモリは電気信号で処理。HDDは機械動作が入るので遅い
・メモリに対するアクセスはnsec(ナノ秒)の単位
・ディスクに対するアクセスはmsec(ミリ秒)の単位
DB待ち時間を減らす為に大事なこと!
①シーケンシャルとフルスキャンの理解が大事
シーケンシャルは「逐次(順を追って)」のことで、先頭から間を抜かさずにアクセス(読み/書き)すること
フルスキャンはテーブルの全レコードを読み込むこと
フルスキャンの際に、メモリにデータがないとシーケンシャルアクセスが発生
②インデックスの考え方
インデックス使わないと待ち時間が大きくなるケースある。
例)転送速度が20MB/sの環境で、1GBの表テーブルをフルスキャする場合、シーケンシャルアクセスとなり、50秒かかる。
インデックス自体のサイズが大きくなっても問題なし。内部的に「インデックスのインデックス」のように、自動的に多段の構成になっているため。
➂IOPS
インデックスでアクセスしても、ランダムアクセスになると時間がかかる。
※ランダムアクセスは、シーケンシャルの反対語。頭出し&回転待ちを繰り返しアクセスする
例)1秒間でシークを100回できるディスクで、一回のIOのサイズが8KBの場合、スループットは800KB/sになる。
→非常に遅い。
※一般的なHDDのシーク速度は100から200
データベースのIOはランダムアクセス多い。なのでIOPSが大事。
一つのディスクだけでデータベースを構築すると遅いのは必至。RAIDで複数ディスク構成にして、
IOPSを上げる=ランダムアクセスが速くなる
OLTP (OnLine Transaction Processing)
たとえば、鉄道の座席予約システムや銀行の入出金処理など。多くの端末からオンラインで大きくないデータを読み書きし、すぐに結果を求めるシステム形態のこと
大きくないデータ すぐに →DBインデックス必要
「インデックスアクセスが有利なのはデータの15%未満」と一般的に言われる。理由は、
ランダムはシーケンシャルよりデータの読み込み効率が悪い
の考えより。
例)二万行がテーブルから一万行とりだす場合
ランダムで取り出すより、フルスキャンでシーケンシャルで全部取り出す方が早い。
1行は8KBとします。今まで使ってきたディスクの性能値を使った計算だと、ランダムアクセスでは約100秒かかります(インデックスは頻繁に使われるので、キャッシュに載っていると想定します)。それに対して2万行全部を読み込むシーケンシャルアクセスでは、すべての行(2万行)をディスクから読み込んでも約8秒で終了します。つまりディスクの特性から、全
ランダムの場合、以下の処理で時間がかかる。各一万回行われる
・インデックス読み込み
2回目以降はキャッシュ活用。
・頭出し
・データ読み込み(一行)
シーケンシャルの場合、以下の処理で時間がかかる。各一回だけ行われる。
・頭出し
・データ読み込み(フルスキャン)