zkusit sql?
Pokud je to jen tento jeden příkaz a způsobuje problémy s výrobou, můžete generátor dotazů pro tuto chvíli vynechat? Jinými slovy, na velmi krátkou dobu stačí napsat SQL sami. Získáte tím trochu času.
# All on one line:
Artist.find_by_sql
"SELECT `artists`.* FROM `artists`
WHERE `artists`.`id` = #{params[:artist_id].to_i} LIMIT 1"
Arel/MySQL vysvětlit?
Rails může pomoci vysvětlit, co se MySQL pokouší udělat:
Artist.find(params[:artist_id]).explain
http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
Možná můžete objevit nějaký rozdíl mezi dotazy, které jsou úspěšné a neúspěšné, například jak explain
používá indexy nebo optimalizace.
drahokam mysql2?
Můžete zkusit přejít z drahokamu mysql na drahokam mysql2? Jaké selhání zaznamenáte, když přejdete na drahokam mysql2?
volatilita?
Možná ještě něco mění hash parametrů za běhu, takže to vidíte, když to vytisknete, ale změní se to během spuštění dotazu?
Zkuste přiřadit proměnnou, jakmile obdržíte parametry:
artist_id = params[:artist_id]
... whatever code here...
@artist = Artist.find(artist_id)
není to hash parametrů?
Napsal jste "Meaning Rails neprochází v parametrech[:artist_id], což je samozřejmě v hash parametrů." Nemyslím si, že to je ten problém-- Očekávám, že to vidíte, protože Rails používá "?" jako zástupný symbol pro připravený příkaz.
Chcete-li to zjistit, spusťte příkazy navržené @Mori a porovnejte je; měly by být stejné.
Article.find(42).to_sql
Article.find(params[:artist_id]).to_sql
připravená prohlášení?
Může jít o problém s mezipamětí připravených příkazů, když je dotaz skutečně proveden.
Zde je kód, který selhává – a je tu velké varování.
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
Zkuste nakonfigurovat databázi tak, aby vypnula připravené příkazy, abyste zjistili, zda to má nějaký význam.
Ve vašem ./config/database.yml
soubor:
production:
adapter: mysql
prepared_statements: false
...
chyby s připravenými příkazy?
Může nastat problém s tím, že Rails toto nastavení ignoruje. Pokud se o tom chcete dozvědět mnohem více, podívejte se na tuto diskuzi a opravu chyb od Jeremeyho Colea a Aarona:https://github.com/rails/rails/pull/7042
Heroku může toto nastavení ignorovat. Zde je způsob, jak můžete zkusit přepsat Heroku opravou nastavení Prepare_statements:https://github.com /rails/rails/issues/5297
odstranit mezipaměť dotazů?
Zkuste odstranit ActiveRecord QueryCache a zjistěte, zda to má nějaký význam:
config.middleware.delete ActiveRecord::QueryCache
http://edgeguides.rubyonrails.org/configuring.html#configuring-middle
zkusit postgres?
Pokud můžete zkusit Postgres, mohlo by to také vyčistit. To pro vás nemusí být dlouhodobé řešení, ale izolovalo by to problém od MySQL.