Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zählen der Anzahl der durchgeführten Abfragen

Ich denke, Sie haben Ihre eigene Frage beantwortet, indem Sie assert_queries erwähnt haben , aber hier geht:

Ich würde empfehlen, einen Blick auf den Code hinter assert_queries zu werfen und verwenden Sie dies, um Ihre eigene Methode zu erstellen, mit der Sie Abfragen zählen können. Die Hauptmagie, die hier involviert ist, ist diese Zeile:

ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)

Ich habe heute Morgen ein bisschen herumgebastelt und die Teile von ActiveRecord herausgerissen, die das Abfragen zählen, und bin auf Folgendes gekommen:

module ActiveRecord
  class QueryCounter
    cattr_accessor :query_count do
      0
    end

    IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/]

    def call(name, start, finish, message_id, values)
      # FIXME: this seems bad. we should probably have a better way to indicate
      # the query was cached
      unless 'CACHE' == values[:name]
        self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r }
      end
    end
  end
end

ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

module ActiveRecord
  class Base
    def self.count_queries(&block)
      ActiveRecord::QueryCounter.query_count = 0
      yield
      ActiveRecord::QueryCounter.query_count
    end
  end
end

Sie können auf ActiveRecord::Base.count_queries verweisen Methode überall. Übergeben Sie ihm einen Block, in dem Ihre Abfragen ausgeführt werden, und er gibt die Anzahl der ausgeführten Abfragen zurück:

ActiveRecord::Base.count_queries do
  Ticket.first
end

Gibt "1" für mich zurück. Damit dies funktioniert:fügen Sie es in eine Datei unter lib/active_record/query_counter.rb ein und fordern Sie es in Ihrer config/application.rb an Datei wie folgt:

require 'active_record/query_counter'

Hey schwupps!

Ein wenig Erklärung ist wahrscheinlich erforderlich. Wenn wir diese Zeile aufrufen:

    ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)

Wir hängen uns in das kleine Benachrichtigungs-Framework von Rails 3 ein. Es ist eine glänzende kleine Ergänzung zur neuesten Hauptversion von Rails, von der niemand wirklich etwas weiß. Es erlaubt uns, Benachrichtigungen über Ereignisse innerhalb von Rails zu abonnieren, indem wir subscribe verwenden Methode. Wir übergeben das Ereignis, das wir abonnieren möchten, als erstes Argument, dann jedes Objekt, das auf call antwortet als zweites.

Wenn in diesem Fall eine Abfrage ausgeführt wird, erhöht unser kleiner Abfragezähler pflichtgemäß die Variable ActiveRecord::QueryCounter.query_count, aber nur für den realen Abfragen.

Das hat jedenfalls Spaß gemacht. Ich hoffe, es ist nützlich für Sie.