Laravel で生の SQL を使用する場合、パフォーマンスに関する考慮事項がいくつかあります。
1. 生の SQL と雄弁な ORM
複雑なクエリについては、特に大規模なデータセットを扱う場合、生の SQL の方が Eloquent ORM よりも高速になる可能性があります。これは、Eloquent ORM が SQL クエリを動的に生成するため、特定のデータベース操作用に最適化された生の SQL クエリと比較してパフォーマンスが低下する可能性があるためです[4]。
2. インデックス作成
データベース テーブルのインデックスを適切に作成すると、クエリのパフォーマンスが大幅に向上します。これは、クエリで使用する特定のインデックスを指定できるため、生の SQL を使用する場合に特に重要です。 Eloquent ORM はインデックス作成もサポートしていますが、常に最も効率的なインデックスを使用するとは限りません[1]。
3. クエリの最適化
生の SQL クエリを手動で最適化して、パフォーマンスを向上させることができます。これには、インデックスの使用、選択される列の数の制限、不必要な結合の回避などの手法が含まれます。 Eloquent ORM はクエリの最適化もサポートしていますが、常に最も効率的な方法を使用するとは限りません[2]。
4. データベース接続
使用されるデータベース接続もパフォーマンスに影響を与える可能性があります。たとえば、MySQL データベースと InnoDB などの高性能ストレージ エンジンを使用すると、MyISAM[1] などの低速ストレージ エンジンを使用する場合に比べて、クエリのパフォーマンスが向上します。
5. メモリ使用量
生の SQL クエリは、特に大規模なデータセットを扱う場合、Eloquent ORM クエリよりも多くのメモリを消費する可能性があります。これは、生の SQL クエリでは、クエリ結果を保存するためにより多くのメモリが必要になることが多いためです。一方、Eloquent ORM は、必要なデータのみを取得するため、メモリの使用量が少なくなります[2]。
6. セキュリティ
生の SQL クエリは、適切にサニタイズされていない場合、セキュリティ リスクを引き起こす可能性があります。これは、生の SQL クエリが SQL インジェクション攻撃に対して脆弱になる可能性があるためです。一方、Eloquent ORM は、そのような攻撃を防ぐためのセキュリティ機能が組み込まれています[3]。
7. デバッグ
生の SQL クエリは、Eloquent ORM クエリよりもデバッグが難しい場合があります。これは、生の SQL クエリが Eloquent ORM クエリと同じレベルのデバッグ情報を提供しないためです。 Eloquent ORM は、実行されたクエリに関する詳細情報を提供するため、パフォーマンスの問題の特定と修正が容易になります[2]。
8. コードの可読性
生の SQL クエリを使用すると、特に複雑なクエリの場合、コードが読みにくくなる可能性があります。一方、Eloquent ORM は、その流暢なインターフェイスを使用して、より読みやすく保守しやすいクエリを作成する方法を提供します[3]。
9. データベースの互換性
Raw SQL クエリは、Eloquent ORM クエリほどデータベースに依存しない可能性があります。これは、生の SQL クエリは使用されているデータベースに固有であるのに対し、Eloquent ORM クエリは最小限の変更で異なるデータベース間で使用できるためです[4]。
10. パフォーマンスの監視
生の SQL クエリは、パフォーマンスの問題を監視するのがより困難になる場合があります。これは、生の SQL クエリが Eloquent ORM クエリと同じレベルのパフォーマンス監視情報を提供しないためです。 Eloquent ORM は、実行されたクエリに関する詳細情報を提供するため、パフォーマンスの問題の特定と修正が容易になります[2]。
要約すると、複雑なクエリの場合、生の SQL クエリは Eloquent ORM クエリよりも高速かつ効率的ですが、セキュリティ リスクも生じ、デバッグと保守がより困難になる可能性があります。
引用:[1] https://deliciousbrains.com/optimizing-laravel-database-indexing-performance/
[2] https://dev.to/jringeisen/laravel-performance-boost-3h4i
[3] https://laravel.io/forum/04-23-2014-eloquent-vs-raw-sql-どれが本当に良いのか
[4] http://www.diva-portal.org/smash/get/diva2:1014983/FULLTEXT02
[5] https://stackoverflow.com/questions/47138952/laravel-eloquent-vs-selectraw-how-does-it-effect-on-query-performance