SQLを試してみませんか?
この1つのステートメントだけで、本番環境の問題が発生している場合は、今のところクエリジェネレータを省略できますか?つまり、非常に短期的には、SQLを自分で作成するだけです。これで少し時間がかかります。
# All on one line:
Artist.find_by_sql
"SELECT `artists`.* FROM `artists`
WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"
ARel / MySQLの説明?
Railsは、MySQLが何をしようとしているのかを説明するのに役立ちます:
Artist.find(params[:artist_id]).explain
http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
おそらく、explain
の方法など、成功しているクエリと失敗しているクエリの間に何らかの違いがあることに気付くでしょう。 インデックスまたは最適化を使用します。
mysql2 gem?
mysqlgemからmysql2gemに変更してみてください。 mysql2 gemに切り替えると、どのような失敗が発生しますか?
ボラティリティ?
おそらく、その場でparamsハッシュを変更する何かがあるので、それを印刷すると表示されますが、クエリが実行されるまでに変更されますか?
パラメータを受け取ったらすぐに変数を割り当ててみてください:
artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)
パラメータハッシュではありませんか?
あなたは「意味レールは明らかにparamsハッシュにあるparams[:artist_id]を渡していない」と書いた。それが問題だとは思いません。Railsが「?」を使用しているため、これが表示されていると思います。プリペアドステートメントのプレースホルダーとして。
調べるには、@Moriによって提案されたコマンドを実行して比較します。それらは同じである必要があります。
Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql
プリペアドステートメント?
クエリが実際に実行されるときに、プリペアドステートメントキャッシュの問題である可能性があります。
これが失敗しているコードです-そして大きな太った警告があります。
begin
stmt.execute(*binds.map { |col, val| type_cast(val, col) })
rescue Mysql::Error => e
# Older versions of MySQL leave the prepared statement in a bad
# place when an error occurs. To support older mysql versions, we
# need to close the statement and delete the statement from the
# cache.
stmt.close
@statements.delete sql
raise e
end
プリペアドステートメントをオフにするようにデータベースを構成して、違いが生じるかどうかを確認してください。
./config/database.yml
で ファイル:
production:
adapter: mysql
prepared_statements: false
...
プリペアドステートメントのバグ?
Railsがこの設定を無視すると問題が発生する可能性があります。それについてもっと詳しく知りたい場合は、Jeremey ColeとAaronによるこのディスカッションとバグ修正を参照してください: https://github.com/rails/rails/pull/7042
Herokuは設定を無視する場合があります。次のように、prepared_statementsセットアップにパッチを適用して、Herokuをオーバーライドしてみることができます。 https://github.com / rails / rails / issues / 5297
クエリキャッシュを削除しますか?
ActiveRecord QueryCacheを削除して、違いが生じるかどうかを確認してください。
config.middleware.delete ActiveRecord::QueryCache
http://edgeguides.rubyonrails.org/configuring.html#configuring-middle
postgresを試してみませんか?
Postgresを試すことができれば、それも解決する可能性があります。それはあなたにとって長期的な解決策ではないかもしれませんが、それは問題をMySQLに切り分けるでしょう。