pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

IOについて

この人の本はおすすめです!

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回目以降はキャッシュ活用。
・頭出し
・データ読み込み(一行)

シーケンシャルの場合、以下の処理で時間がかかる。各一回だけ行われる。
・頭出し
・データ読み込み(フルスキャン)