sql >> データベース >  >> RDS >> Mysql

RailsはどのようにMySQLステートメントを作成しますか?

    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に切り分けるでしょう。



    1. MySQL-最も「人気のある」レコードのリストを生成します

    2. SQLServerのメッセージ529「データ型intからxmlへの明示的な変換は許可されていません」を修正しました

    3. WindowsでのMySQLの小文字のテーブル名Unixでの大文字の名前

    4. HP-UXItaniumをSQLServerに接続します