GoのMySQLドライバは、なぜパラメータ数が増えるとPrepared Statementが急激に遅くなるのか?
BRANK
こんにちは、株式会社 PKSHA Technology ソフトウェアエンジニアの中西です。1. はじめにGo 言語で MySQL を利用する場合、標準ライブラリの database/sql と、ドライバである go-sql-driver/mysql を組み合わせるのが一般的です。この構成は、事実上のデファクトスタンダードとして定着しています。また、セキュリティ対策も重要です。特に SQL インジェクションを防ぐため、プレースホルダ ? を用いた Prepared Statement の利用はベストプラクティスと言えます。 rows, err := db.Query("SELECT * FROM users WHERE id = ?", id) しかし、この標準的で安全な構成でも、パフォーマンスが著しく劣化するケースはあります。本稿では Prepared Statement の 2 方式を整理し、Go のデフォルト設定で性能が落ちる原因をベンチマーク結果と合わせて示します。解決策と採用時のトレードオフ、判断基準もまとめます。2. Prepared Statement の 2 つの方式パフォーマンス劣化の原因を理解するためには、ドライバ内部の実装方式を知る必要があります。2.1 Server-Side と Client-Side の違いPrepared Statement には、大きく 2 つの方式があります。Server-Side Prepared Statement: …