Ruby on Rails, ActiveRecord, двоичный поиск
-
22-08-2019 - |
Вопрос
Если бы у меня была следующая таблица.
create_table :my_table, :id => false do |t|
t.string :key_column
t.string :value_column
end
Как мне гарантировать, что строки оптимальны? хранится для двоичного поиска по полю :key?
И как мне убедиться, что используется двоичный поиск?
Решение
Для любого интересного количества строк оптимальным способом (для большинства определений понятия «оптимальный») доступа к одной случайной записи по ключу является создание индекса.
CREATE INDEX my_index ON my_table ( key_column );
или при миграции ActiveRecord:
add_index(:my_table, :key_column)
Индексы базы данных обычно используют двоичный поиск, используя B-деревья или аналогичный, который обеспечивает хороший баланс между затратами на хранение и временем поиска и обновления.
Обеспечение использования индекса должно быть относительно простым для операций с одной таблицей:
MyTable.find_by_key_column('ABC123')
например, должно сгенерироваться что-то вроде этого (проверьте development.log):
SELECT * FROM my_table WHERE (key_column = 'ABC123')
который даже у относительно не впечатляющего оптимизатора MySQL не должен иметь проблем при оптимальной работе.
Хранение строк не должно вызывать беспокойства при извлечении отдельных строк, и это хорошо, поскольку в любом случае вы мало что можете сделать, чтобы контролировать это.Для обеспечения производительности MySQL вам, вероятно, следует выбрать MyISAM вместо InnoDB в качестве механизма хранения, при условии, что ваше определение «оптимального» не включает «самый надежный».
Другие советы
Задача базы данных — точно хранить и извлекать данные.Вы описываете то, что хотите, и оно это обеспечивает.Если вы хотите контролировать конкретно как если речь идет об этом, то база данных не является ответом.