Open totetotetotem opened 6 years ago
mysqlのクエリを高速化する。
mysqlのクエリはボトルネックになりがちなので。
N+1はまた別のissueで。
カラムの指定
SELECT * FROM table
みたいなクエリがあった場合、使用するカラムを指定して
SELECT column FROM table
みたいにするだけでクエリを若干高速化できる。
LIMITの指定 SELECT して得た結果の内、使用しているデータ数が限られている場合、LIMITで取得データ数に制限をかける。 例えば20件しか使用していない場合
SELECT * FROM table LIMIT 20
みたいに取得件数を減らす。
JOINの削減 よく使用されるクエリにJOINがあった場合、時間を食うので、はじめから使用するデータのみJOINしたテーブルを作成しておいて、そのテーブルのSELECTに置き換える。
DB接続時設定 goのsqlにおいて、prepareを使わず直接Executeやcommitを使用した場合、sql内でprepare, execute,closeで3回のラウンドトリップが生じてしんどい。 このとき、interpolatePrams=trueとすると、直接ExecuteやCommitを使用した場合でも、ドライバのgo側でプレースホルダを組み立てた上で、SQLに投げてくれるおかげでラウンドトリップが1回に削減できる。
dsnにinterpolateParams=trueを追加する 例
db, err := sql.Open("mysql", "root:password@tcp(localhost:3306)/test?interpolateParams=true&collation=utf8mb4_bin")
最後のやつは結構効果あった 82000 -> 86000くらいになった
なにをやるか
mysqlのクエリを高速化する。
なぜやるか
mysqlのクエリはボトルネックになりがちなので。
どうやるか
N+1はまた別のissueで。
カラムの指定
みたいなクエリがあった場合、使用するカラムを指定して
みたいにするだけでクエリを若干高速化できる。
LIMITの指定 SELECT して得た結果の内、使用しているデータ数が限られている場合、LIMITで取得データ数に制限をかける。 例えば20件しか使用していない場合
みたいに取得件数を減らす。
JOINの削減 よく使用されるクエリにJOINがあった場合、時間を食うので、はじめから使用するデータのみJOINしたテーブルを作成しておいて、そのテーブルのSELECTに置き換える。
DB接続時設定 goのsqlにおいて、prepareを使わず直接Executeやcommitを使用した場合、sql内でprepare, execute,closeで3回のラウンドトリップが生じてしんどい。 このとき、interpolatePrams=trueとすると、直接ExecuteやCommitを使用した場合でも、ドライバのgo側でプレースホルダを組み立てた上で、SQLに投げてくれるおかげでラウンドトリップが1回に削減できる。
dsnにinterpolateParams=trueを追加する 例