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ハッシュではありませんか?
あなたは「MeaningRailsは明らかに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に分離するでしょう。