Carpe Diem

備忘録

MySQL

PreparedStatement とクエリキャッシュ

概要 PreparedStatement はSQLを実行する際に「SQL文の構造」と「パラメータ」を分離して扱える仕組みです。 それによって パフォーマンスの向上 セキュリティの向上 コードの可読性・保守性の向上 を図ることが可能です。 今回はその理由を説明します。 Pre…

データベースのコネクションプーリング

概要 データベースを扱うと、パフォーマンス向上を考えた際に必ず出てくるコネクションプーリングについてです。 今回はコネクションプーリングの種類とその特徴についてと、各データベースの特性に合わせてどんな選択を取るのが良いかを説明します。 コネク…

トランザクション分離レベルのケースと対応方法

背景 トランザクションの分離レベルで出てくる用語がぱっと頭に浮かぶよう、問題が発生するケースと対応方法をまとめます。 起きうる問題 基本的にどのDBも単一オブジェクトの原子性と分離性は保証します。 つまりデータ送信の途中でネットワーク接続が切れ…

デッドロックとその対策

概要 複数のトランザクションが共通のリソースにアクセスする際に気をつけるものとしてデッドロックがあります。 例えばこのように一方はResource1, Resource2とロックしてアクセスし、もう一方はResource2, Resource1とロックしてアクセスする場合、うまく…

B TreeとB+ Treeの違い

概要 インデックスに対してMongoDBはB Treeを採用し、MySQLのInnoDBはB+ Treeを採用しています。 どうして採用しているアルゴリズムが違うのだろう?と思って調べてみました。 主な違い B+ TreeはほとんどB Treeと同じですが、以下の点が異なります。 リーフ…

MongoDBのAggregationとSQLの比較

概要 MongoDBのAggregationとSQLとの比較です。 どうやって集計するかな?と悩んだ時に慣れているSQLとの比較があると分かりやすいと思って公式ドキュメントに沿った形で載せてます。 環境 MongoDB 3.0.7 オペレータの比較 SQL MongoDB WHERE $match GROUP B…