簡體   English   中英

在執行之前記錄查詢

[英]Log query before executing it

我遇到了一個問題,我運行一些查詢並且 mysqld 進程開始使用 100% CPU 功率,而沒有結束。 我想查明這個查詢。 問題是 log/development.log 只包含已完成的查詢。 任何想法?

我認為你有幾個選擇。 首先是真正查看您的 development.log 並查看導致它的操作。 查看您要求 rails 運行的查詢並嘗試查明該特定查詢。 如果花費大量時間,則可能意味着您正在執行諸如返回 n+1 個查詢、缺少索引或其他一些性能殺手之類的事情。

你說開發日志只有已經完成的查詢。 你不能計算出下一個要運行的查詢是什么嗎?

您的其他選項涉及使用日志啟動 mysqld(我認為其中一些名稱已更改):

mysqld --log[=file_name] --log-slow-queries[=file_name]

使用 mysql 中的 processlist 顯示當前語句列表:

show processlist;

為了防止類似的事情再次發生,您還可以花一些時間查看 Rails 性能監視器,例如 New Relic 的 RPM( http://www.newrelic.com/ )。

我希望這有幫助!

您可以通過以下方式查看正在運行/未完成的語句

show processlist;

命令。

如果您已評估 MySQL,請考慮 SQL 查詢

SHOW PROCESSLIST

或者從命令行:

mysqladmin processlist

或者,最強大的方法是覆蓋 ActiveRecord::Base 連接實例的“執行”方法。 本文展示了一般方法:

http://www.misuse.org/science/2006/12/12/sql-logging-in-rails/

你把這段代碼放到 application.rb 中:

# define SQL_LOG_FILE, SQL_LOG_MAX_LINES

connection = ActiveRecord::Base.connection
class << connection
    alias :original_exec :execute
    def execute(sql, *name)
        # try to log sql command but ignore any errors that occur in this block
        # we log before executing, in case the execution raises an error
        begin
            lines = if File::exists?(SQL_LOG_FILE) then IO::readlines(SQL_LOG_FILE) else [] end
            log = File.new(SQL_LOG_FILE, "w+")
            # keep the log to specified max lines
            if lines.length > SQL_LOG_MAX_LINES
                lines.slice!(0..(lines.length-SQL_LOG_MAX_LINES))
            end
            lines << Time.now.strftime("%x %I:%M:%S %p")+": "+sql+"n"
            log.write(lines)
            log.close
            $sql_log = sql
        rescue Exception => e
            ;
        end
        # execute original statement
        original_exec(sql, *name)
    end # def execute
end # class <<

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM