Все seek , которые выполняет системный вызов, изменяет позицию в файле, где будет следующее чтение. Он не двигает головку привода. Головки дисков перемещаются, когда данные читаются или записываются, и у вас нет прямого контроля над тем, что будет делать следующая ОС.
Чтение большого количества данных, которые вам не нужны, оказывает влияние, поскольку все считанные данные требуют пространства в буферах ОС и приводят к удалению старых данных. Поэтому использование поиска по большим файлам будет меньше мешать кешу файловой системы.
Все, что я пишу ниже, предполагает, что вы не можете поместить всю базу данных в память. Если можешь, просто сделай это. Прочитайте все и попробуйте добавить новые и измененные данные в конец файла. Не беспокойтесь о потраченном впустую месте, просто время от времени уплотняйте.
Если ваша база данных слишком велика:
Данные читаются и записываются на физический диск блоками (или страницами). Точно так же основной единицей дискового ввода-вывода в вашей ОС является страница. Если ОС кеширует данные с диска, то это также целые страницы. Поэтому думать, нужно ли вам двигаться вперед на несколько байтов, используя поиск или чтение, не имеет большого смысла. Если вы хотите сделать это быстро, вы должны принять во внимание, как действительно работает дисковый ввод-вывод.
Во-первых, уже упомянутый nobugz, местность ссылки. Если данные, которые вы используете в каждой операции, расположены близко друг к другу в файле, ваша ОС должна будет читать или писать меньше страниц. С другой стороны, если вы распространяете свои данные, многие страницы нужно будет читать или записывать одновременно, что всегда будет медленным.
Что касается структуры данных для индекса. Обычно они организованы как B-деревья . Это структура данных, созданная специально для эффективного поиска больших объемов данных, хранящихся в памяти, с постраничными операциями чтения и записи.
И обе стратегии организации данных используются на практике. Например, MS SQL Server по умолчанию хранит данные первым способом: данные хранятся отдельно, а индексы содержат только данные из проиндексированных столбцов и физические адреса строк данных в файлах. Но если вы определите кластерный индекс, то все данные будут храниться в этом индексе. Все остальные индексы будут указывать на данные через ключ кластеризованного индекса вместо физического адреса. Первый способ проще, но другой может быть гораздо эффективнее, если вы часто сканируете диапазоны данных на основе кластерного индекса.