Оптимизировать поиск по базе данных Rails

Я строю проект rails, и у меня есть база данных с набором таблиц... каждая из которых содержит от 500 тыс. До 1 млн строк, и я постоянно создаю новые строки.

По характеру проекта перед каждым созданием мне приходится искать в таблице дубликаты (для одного поля), поэтому я не создаю одну и ту же строку дважды. К сожалению, так как моя таблица растет, это занимает все больше и больше времени.

Я думал, что мог бы оптимизировать поиск, добавляя индексы к определенным полям String, по которым я ищу... но я слышал, что добавление индексов увеличивает время создания.

Итак, мой вопрос заключается в следующем: какова компромисс с поиском и созданием строк, которые содержат поля, которые проиндексированы? Я знаю, что добавление индексов в поля приведет к ускорению моей программы с Model.find_by_name... но насколько медленнее будет создание строки?

1 ответ

Решение

Индексирование замедляется при вводе записей, потому что требуется добавить запись в индекс, и для этого требуются некоторые ресурсы, но после добавления они ускоряют ваши запросы выбора, то есть, как вы сказали, НО, возможно, b-дерево не является правильным выбором для вас! Потому что B-Tree индексирует первые X единиц индексированного предмета. Это замечательно, когда у вас есть целые числа, но текстовый поиск сложно. Когда вы делаете запросы, как

Model.where("name LIKE ?", "#{params[:name]}%")

это ускорит выбор, но когда вы используете такие запросы:

Model.where("name LIKE ?", "%#{params[:name]}%")

это не поможет вам, потому что вы должны искать всю строку, которая может быть длиннее нескольких сотен символов, и тогда не будет лучше, если первые 8 единиц строки длиной 250 символов будут проиндексированы! Так что это одна вещь. Но есть другое....

Вы должны добавить УНИКАЛЬНЫЙ ИНДЕКС, потому что в базе данных лучше найти дубликаты, чем в ruby! Он оптимизирован для сортировки и, безусловно, является более коротким и чистым способом решения этой проблемы! Конечно, вы должны также добавить валидацию к соответствующей модели, но это не повод, чтобы все связывалось с базой данных.

// о скорости индекса

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

У вас нет большого набора опций. Я не думаю, что потеря скорости вставки будет такой большой, когда вам нужен только один индекс! Но выбранная скорость будет увеличиваться пропорционально!

Другие вопросы по тегам