Оптимизировать поиск по базе данных Rails - PullRequest
0 голосов
/ 18 ноября 2011

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

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

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

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

1 Ответ

2 голосов
/ 19 ноября 2011

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

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

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

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

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

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

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

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

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

...