Записать запрос перед его выполнением - PullRequest
2 голосов
/ 06 марта 2009

Я столкнулся с проблемой, когда я запускаю какой-то запрос, и процесс mysqld запускается с использованием 100% мощности процессора, без остановки. Я хочу точно определить этот запрос. Проблема в том, что log / development.log содержит только завершенные запросы. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 06 марта 2009

Я думаю, у вас есть несколько вариантов для этого. Первый - это посмотреть на ваш файл development.log и посмотреть, какие действия вызывают его. Посмотрите на запросы, которые вы просите rails, и попытайтесь точно определить этот конкретный запрос. Если это занимает много времени, это, вероятно, означает, что вы делаете что-то вроде возврата n + 1 запросов, отсутствующих индексов или какого-то другого убийца производительности.

Вы говорите, что в журнале разработчиков есть только завершенные запросы. Не можете ли вы определить, каким будет следующий запрос?

Другие ваши варианты включают запуск mysqld с журналом (я думаю, что имена некоторых из них изменились):

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

Отображение текущего списка операторов с использованием processlist из mysql:

show processlist;

Чтобы не допустить повторения подобных событий, вы также можете потратить некоторое время на просмотр монитора производительности рельсов, например RPM от New Relic (http://www.newrelic.com/).

Надеюсь, это поможет!

2 голосов
/ 06 марта 2009

Вы можете посмотреть запущенные / незавершенные операторы через

show processlist;

команда.

1 голос
/ 06 марта 2009

Если вы оцениваете MySQL, рассмотрите запрос SQL

SHOW PROCESSLIST

Или из командной строки:

mysqladmin processlist

В качестве альтернативы, самый мощный способ - переопределить метод execute экземпляра соединения 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 <<
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...