Railsサーバーの再起動時だけでなく、本番環境でも大量のSHOW TABLES;andクエリが見られます。DESCRIBE `table name`;パーティション化されたテーブル専用であることに気付きました。これは Rails 3.1.1 でのものです - 他のバージョンではテストされていません。
開発コンソールで ( を使用してcache_classes = true) テストしたところ、分割されたモデルについて、Rails が 任意の find メソッドから返されたレコードごとにSHOW TABLES;1 つと 1 つ実行されることに気付きました。DESCRIBE `table name`;
たとえば、itemsがパーティション化されていて、 Item.limit(5)5 つのレコードを返す場合、mySQL ログは次のようになります (注:SHOW TABLESの ANDDESCRIBEは Rails のログには含まれません)。
SELECT `items`.* FROM `items` LIMIT 5;
SHOW TABLES;
DESCRIBE `items`;
SHOW TABLES;
DESCRIBE `items`;
SHOW TABLES;
DESCRIBE `items`;
SHOW TABLES;
DESCRIBE `items`;
SHOW TABLES;
DESCRIBE `items`;
それはかなり正気ではありません。
もちろん、Railsサーバーを起動するときを除いて、パーティション化されていないモデルはSHOW TABLES「」も「」も実行しません。DESCRIBEAR モデルが主キーを認識していない場合、AR はそのモデルのオブジェクトがインスタンス化されるたびにスキーマを取得する必要があるようです。
cache_classesが に設定されている場合true、Rails は既知の主キーのないモデルでもスキーマをキャッシュする/キャッシュする必要があると考えるでしょう。しかし、そうではありません。
システムに実際に影響を与えるSHOW TABLESとは思わないでしょうが、十分なトラフィックがあると、1 つのパーティション テーブルに対するこれらの余分なクエリによる同時読み取りが実際のパフォーマンスの問題を引き起こすことがわかりました。DESCRIBE
これらのクエリをどのように取り除くことができますか?