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
「」も「」も実行しません。DESCRIBE
AR モデルが主キーを認識していない場合、AR はそのモデルのオブジェクトがインスタンス化されるたびにスキーマを取得する必要があるようです。
cache_classes
が に設定されている場合true
、Rails は既知の主キーのないモデルでもスキーマをキャッシュする/キャッシュする必要があると考えるでしょう。しかし、そうではありません。
システムに実際に影響を与えるSHOW TABLES
とは思わないでしょうが、十分なトラフィックがあると、1 つのパーティション テーブルに対するこれらの余分なクエリによる同時読み取りが実際のパフォーマンスの問題を引き起こすことがわかりました。DESCRIBE
これらのクエリをどのように取り除くことができますか?