N+1問題
概要
DBアクセスが合計 N+1 回実行される問題
- SELECT を 1 回実行し、N レコードを取得
- Nレコードに関連するデータを取得するSELECT を N 回実行
抽象化コード
list_all = select_all() // Nレコード取得 for( row in list_all){ detail = select_detail(row.id) // N回DBアクセス }
背景
↑の実装は馬鹿馬鹿しいが、ORMを使う場合に自動で発行されるクエリに発生しやすいそうだ。
対策
- JOIN句で結合する
- Eager loadingを使う
Eager loading
- SELECT を 1 回実行し、N レコードを取得
- Nレコードに関連するIDをリストにする。
- 関連IDリストを引数にしてSELECTを一回実行(Nレコードを取得)
ACID特性とは
Atomicity(原子性)
トランザクション内の処理がすべて実行されるか、または全く実行されないことを保証する性質。
Consistency(一貫性)
トランザクションによりデータの矛盾が生じず、整合性を満たすことを保証する性質。
Isolation(独立性)
複数のトランザクションを同時に実行した場合と、順番に実行した場合の結果が等しくなることを保証する性質。通常は使用するデータにロックをかけることで直列化可能性を保証する。
Durability(永続性)
トランザクション操作の完了通知をユーザが受けた時点で、以後システムに障害が発生しても失われないことを保証する性質。 多くのデータベース実装では、トランザクション操作を永続性記憶装置上にログとして記録し、システムに異常が発生したらそのログを用いて異常発生前の状態まで復旧することで永続性を実現している。(ジャーナリング)
バックエンドエンジニアのロードマップ(文字起こし)
- インターネット
- 基本的なフロントエンドの知識
- OSの基本的な知識
- OSの仕組み
- プロセス管理
- スレッドと同時並行性
- メモリ管理
- プロセス間通信
- 入出力管理
- POSIXの基礎
- 基本的なネットワーク構成
- プログラミング言語
- バージョン管理システム
- リレーショナルDB
- データベースをより詳しく
- ORM
- ACID特性
- トランザクション
- N+1問題
- 正規化
- インデックス
- NOSQLデータベース
- APIについて
- REST
- JSON APIs
- Authentication
- キャッシュ
- CDN
- サーバーサイド
- redis
- クライアントサイド
- webのセキュリティ
- テスト
- 総合テスト
- ユニットテスト
- 機能テスト
- CI/CD
- デザインと開発の原理
- SOLIDの原則
- KISSの原則
- YAGNIの原則
- DRYの原則
- アーキテクチャパターン
- モノリシックAPP
- マイクロサービス
- サービス思考アーキテクチャ
- サーバーレス
- 検索エンジン
- コンテナリゼーション vs 仮想化
- Docker
- プロダクトを拡大させる