1. はじめに
LaravelでWebアプリケーションを開発する際、データベースの第一選択肢としてMySQLやPostgreSQLが選ばれることが多いかと思います。しかし、エンタープライズ向けのシステム開発や、既存の社内資産(Microsoftエコシステム)との統合、あるいはクライアントの指定などにより、SQL Server(Microsoft SQL Server)を採用しなければならない局面があります。
クエリビルダやEloquent(ORM)によってデータベースの違いはある程度抽象化されますが、設計や運用のフェーズでは、SQL Server特有の仕様や挙動の違いについて事前に把握しておく必要があります。
この記事では、実際にLaravel × SQL Serverの構成でシステムを構築した際の経験をもとに、実装時における具体的な注意点と、AWSのRDSで稼働させる際のインフラ視点での考慮すべきポイントをまとめました。
2. Laravel実装・仕様における注意点(MySQLとの違い)
まずは、Laravelのアプリケーションコードやデータベース設計(マイグレーション)を行う上で、MySQLとの違いに留意すべきポイントを解説します。
① ドライバーの導入
② 【事例】UUIDのケース(大文字・小文字)による影響
Laravel側で主キーや外部キーとしてUUIDを採用する場合、データベースのデータ型による挙動の違いに注意が必要です。
などで発行されるUUIDは、通常アルファベット小文字(例:
)です。しかし、これをSQL Serverの
型の列に登録すると、データベース側では自動的にアルファベット大文字(例:
)に変換されて格納されます。
PHP
// Laravel側で発行(小文字) $uuid = (string) Str::uuid(); // "a1b2c3d4-..." User::create(['id' => $uuid, 'name' => 'テストユーザー']); // SQL Server側には大文字で保存される // "A1B2C3D4-..."
)であれば、SQLの検索(
句など)自体は問題なく一致します。
)を行う」といった処理を含んでいる場合、大文字と小文字の差異によって不一致と判定されてしまうケースがあります。
SQL Serverから取得したUUIDをプログラム側で扱う際は、常に
や
で小文字に統一するか、型を
ではなく
にして文字列として小文字のまま保存するなどの設計上の工夫が有効です。
③ マイグレーションの挙動差
と定義した場合、MySQLでは
型になりますが、SQL Serverでは
型(Unicode文字列)として作成されます。
は日本語などのマルチバイト文字を考慮する上で安全ですが、1文字あたりに必要なバイト数が異なるため、インデックスの最大サイズ上限に影響を与える場合があります。また、外部キー制約の命名規則や長さの上限もMySQLとは異なるため、既存のマイグレーションファイルを流用する際は事前の検証が推奨されます。
④ 生SQL(MySQL固有関数)の互換性
や
を使い、生SQLを書くことがあります。この際、MySQL特有の関数を使っていないか確認が必要です。
-
- 日付の取得: MySQLの
NOW()
は、SQL Server(T-SQL)では
GETDATE() - 文字列結合: MySQLの
GROUP_CONCAT()
は、SQL Serverでは
STRING_AGG() - ページネーション:
LIMIT / OFFSET
の記述(SQL Serverのバージョンや構文によっては
OFFSET FETCHを使用)
- 日付の取得: MySQLの
3. AWS RDS(SQL Server)で稼働させるときの注意点
① 【事例】クエリのメモリ見積もりと処理の待ち時間(ウェイト)への対策
- データ量が少なく軽量なクエリであっても、一時的なソートや結合(Join)が含まれていると、システムが「この処理には一定以上のメモリが必要である」と推測してメモリを要求する。
- 同時に複数のリクエストが集中すると、データベース全体の空きメモリが一時的に不足し、処理が実行されずにメモリ確保の順番待ち(RESOURCE_SEMAPHOREウェイト)が発生する。
- 結果として、データ量が少ないにもかかわらず、レスポンスに大幅な待ち時間(遅延)が生じてしまう。
MySQLなどの感覚で「データ量が少ないうちは最小限のスペック(db.t4g.microなど)で対応できる」と判断すると、思わぬボトルネックになることがあります。この挙動に対応するためには、インデックスを徹底的に最適化してメモリ要求量を抑えることはもちろん、「メモリ割り当てに余裕を持たせる(RDSのインスタンスクラスをはじめから高めに選定する)」というインフラ側からのアプローチが効果的です。
② ライセンス費用によるコスト面の影響
③ Amazon Auroraの選択肢について
④ タイムゾーンの固定仕様
)を設定することができます。