Ruby on Rails, ActiveRecord, бинарный поиск - PullRequest
0 голосов
/ 17 мая 2009

Если бы у меня была следующая таблица.

create_table :my_table, :id => false do |t|
   t.string :key_column
   t.string :value_column
end

Как бы убедиться, что строки оптимально сохранены для двоичного поиска по полю: key?

И как мне убедиться, что бинарный поиск используется?

Ответы [ 2 ]

2 голосов
/ 17 мая 2009

Для любого интересного числа строк оптимальным способом (для большинства определений «оптимального») доступа к одной случайной записи по ключу является создание индекса.

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 в качестве механизма хранения, при условии, что ваше определение «оптимального» не включает «наиболее надежный».

1 голос
/ 17 мая 2009

Задачей базы данных является точное хранение и извлечение данных. Вы описываете, что вы хотите, это доставляет это. Если вы хотите конкретно контролировать как , то база данных - не ответ.

...