Ich versuche, ein Leistungsproblem zu lösen, wo wir eine WHERE IN-Klausel für eine Tonne nicht sequenzielle IDs ausführen. Gemäß this und dem MySQL-Leistungsbuch können Sie die Leistung beschleunigen, indem Sie eine temporäre Tabelle mit dem betreffenden Feld erstellen und sich der Tabelle anschließen, die Ihnen wichtig ist.Verzögern Sie eine temporäre Tabelle in MySQL mit ActiveRecord
Ich habe folgende Rails-Code innerhalb einer ActiveRecord::Base
Klasse:
def self.where_in(field, ids)
tmp_table = "tmp_table_#{SecureRandom.uuid.gsub('-', '_')}"
begin
# Create temporary table with one column
connection.execute("CREATE TEMPORARY TABLE #{tmp_table} (param INT NOT NULL PRIMARY KEY) ENGINE=Memory")
# Insert ids into the table (doesn't have to be ids)
vals = ids.map{|i| "(#{i})"}.join(", ")
connection.execute("INSERT INTO #{tmp_table} (param) VALUES #{vals};")
# Return the join relation which is the same as WHERE IN (...)
return self.joins("INNER JOIN #{tmp_table} on #{field} = #{tmp_table}.param").all
ensure
# Drop table after we're done...this is the problem
connection.execute("DROP TEMPORARY TABLE IF EXISTS #{tmp_table}")
end
end
Aber das Problem ist, dass dies eine SQL-Anweisung in Abhängigkeit von der Existenz einer temporären Tabelle erstellt, die mir in der Erklärung sicherzustellen, fallen zu lassen. Wenn ich die use-Anweisung entferne, funktioniert es gut, aber die temporäre Tabelle ist noch vorhanden.
In Anbetracht dieser Tatsache ist meine Frage:
Wie würde ich „verschieben“, um den Abwurf dieser Tabelle hinter die Tabellennamen auf einen Hintergrund Arbeiter knallen zu einem späteren Zeitpunkt fallen zu lassen?
ODER
Würde ich sicher sein, nicht auf den Tisch fallen und übernehmen nur die Verbindungspool die Verbindung ernten, wodurch die Tabelle schließlich fallen?