sql >> Databáze >  >> RDS >> Mysql

Jak Rails vytváří MySQL příkaz?

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.



  1. Jak načíst data dvou sloupců ve formátu A, B v Oracle

  2. PHP kód pro vložení hodnoty zaškrtávacího políčka do konkrétního sloupce na mysql s výběrem formuláře

  3. Hibernace + logika ON DUPLICATE KEY

  4. Tabulka je příliš široká na to, aby se vešla do PDF generovaného Markdown