Поиск по дате.синтаксический анализ (строка) невероятно медленный?

#ruby-on-rails #ruby #ruby-on-rails-3

#ruby-on-rails #ruby #ruby-on-rails-3

Вопрос:

Я использовал эпизод поиска Райана Бейта с Ajax, чтобы написать некоторые базовые функции поиска.

Что он в основном делает, так это берет строку из формы и выполняет аналогичный запрос с помощью метода модели. То, что я пытаюсь сделать, это выполнить условный поиск по разным столбцам (due_date и name ) в базе данных с помощью одной строки, которую я анализирую с помощью класса Date . Таким образом, пользователь может искать элементы по дате или по имени элемента в той же форме. Мой метод выглядит так:

 def self.search(search) 
    if search
      search_date = Date.parse(search) rescue nil
    end

    if search_date
      where('due_date = ?', search_date)
    elsif search
      where('UPPER(name) LIKE ?', "%#{search.upcase}%")
    else
      scoped
    end
  end  
  

Это работает, как если бы пользователь вводил дату, класс Date может ее проанализировать и искать в базе данных любые объекты, у которых есть это значение due_date . Проблема в том, что если это дата и ее можно анализировать, поиск происходит невероятно медленно.

Мне было интересно, есть ли у кого-нибудь способ ускорить это. Это класс Date такой медленный? Должен ли я использовать два разных метода? или я должен полностью переписать свой поиск?

Ответ №1:

Я действительно сомневаюсь, что это Date.parse медленно. Вы log/development.log должны проверить, каково время выполнения запроса. То, что вы, скорее всего, испытываете, — это сканирование таблицы, потому что у вас отсутствует индекс due_date .

Всегда проверяйте медленные запросы с помощью EXAMINE . Пример:

 EXAMINE SELECT * FROM items WHERE due_date='2011-01-01'
  

Вы получите некоторую информацию о количестве строк, которые ему нужно будет отсортировать, плюс любые индексы, которые могут быть использованы.

Ответ №2:

Хотя обработка даты в Ruby, как известно, медленная, это не будет заметно для одного такого вызова…

Вероятно, в вашей базе данных отсутствует индекс…

Проверьте, что вы определили в качестве индексов для вашей таблицы, о которой идет речь… Вы должны выполнять миграцию с этим в нем:

 add_index :my_table, :due_date
  

Тогда ваша база данных сможет быстро находить записи.

Ответ №3:

В то время как предыдущие ответы о поиске медленных запросов и использовании индекса, вероятно, принесут вам больше пользы, вам также следует ознакомиться с реализацией Date / DateTime Райана Эвана на языке C, жемчужиной home_run .