本当にただのメモ

なるべく Qiita に投稿しよう

日付カラムをアプリに入れさせるか、DB に入れさせるか

まだ結論は出せていない。

  • アプリに入れさせるメリット
    • テストのとき便利
      • ちょっと時刻を変えたい、とか
      • 並び順を保証させたいとか(逆に DB だと 1秒たりとも変わらないと並び順が不定になる)
  • DB に入れさせるメリット
    • 漏れがない
    • アプリケーションサーバーが複数あって微妙に時刻がズレてるとかになるよりmaster dbの時刻で決まって便利

ログ的な役割だったらDBに入れさせて、アプリに絡むやつとかはアプリで入れる ... とか?(しかしテーブルに寄ってポリシーが分かれるのもそれはそれで ... という感じがする)

case sensitive にするために BLOB 型にするのは現代では BK 、カラム個別に CHARSET を指定すれば良い

例:

name VARCHAR(255) CHARACTER SET ascii COLLATE ascii_bin NOT NULL

この方法のメリット:

  • 想定外のマルチバイトが入らない
    • 逆に BLOB だとアプリケーションで気をつけないとバイナリ列を突っ込める

ちなみに CHARACTER SET = ascii だとデフォルトでは COLLATION ( 照合順序 ) は ascii_general_ci なので( ↓ 証拠。ci は case insentive の略)、case sensitive にするなら COLLATE ascii_bin を付けるのがキモ。

> SHOW CHARACTER SET WHERE Charset LIKE '%ascii%';
+---------+-------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+-------------+-------------------+--------+
| ascii   | US ASCII    | ascii_general_ci  |      1 |
+---------+-------------+-------------------+--------+
1 row in set (0.00 sec)

See Also

BINARY, VARBINARY, BLOB

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.4.2 BINARY および VARBINARY 型

  • 字の如く、バイナリ文字列を格納する
  • BINARY(N) VARBINARY(M) N, M は文字数でなくバイト数である
  • BLOB = VARBINARY 型で格納できるバイト数を指定しなかったもの、と捉えれば良い
最大値 パッド値 (0x00) の扱い
BINARY 255 B 指定したバイト数よりも少ないデータを格納した場合には末尾に 0x00 を必要なだけ付け指、定のバイト数になるように調整されてから格納される。また取得した時にも削除されずに 0x00 が付いたまま取得される
VARBINARY 64 KB 0x00 が末尾に付けられることはない

レプリ遅延の原因

漢(オトコ)のコンピュータ道: MySQLにおけるレプリケーション遅延の傾向と対策

  • ネットワークの遅延
  • 巨大なトランザクションを実行した
  • スレーブの負荷が高すぎる

自分の経験的には圧倒的に 2 番目が多い。 むしろ 3 番目のケースには出会ったことがなかった。

スレーブの負荷が高すぎる

スレーブが処理出来る量を超えた更新がマスターからやってくると、スレーブでは更新が滞ってしまう。ひとつの大きなトランザクションによる遅延は突如としてやってくるが、こちらの場合は徐々にスレーブが遅れていくことになる。

このケースの対処法としては下記になる。

  • master の更新量を減らす
  • slave の処理のボトルネック ( disk i/o, cpu, memory, etc ... ) を見つけて取り除く

MariaDB

リクエストヘッダ / レスポンスヘッダを dump して HTTP リクエスト

H → リクエストヘッダ、h → レスポンスヘッダ。 httpie は良い。curl はオプション覚えられなさすぎる ...

$ http --print hH GET https://blog.sushi.money/ 'User-Agent:Mozilla/5.0 zgrab/0.x'
GET / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: blog.sushi.money
User-Agent: Mozilla/5.0 zgrab/0.x

HTTP/1.1 403 Forbidden
Connection: keep-alive
Content-Length: 162
Content-Type: text/html
Date: Fri, 03 Aug 2018 04:02:24 GMT
Server: nginx