B + деревья заказать количество предметов с помощью ключа. В этом случае ключ - это число, а элемент - имя человека. Все дерево B + не нужно помещать в память - только текущий узел, который ищется. Вы можете установить максимальный размер узлов (и косвенно глубину дерева), чтобы узел помещался в памяти. (На практике узлы обычно намного меньше, чем объем памяти.)
Элементы данных хранятся на листьях дерева, в так называемых блоках. Вы можете хранить элементы, встроенные в индекс, или сохранять указатели на внешнее хранилище. Если данные имеют регулярный размер, это может обеспечить эффективный поиск из файлов. В примере с вопросом элементы данных могут быть отдельными именами, но было бы более эффективно хранить блоки имен, причем все имена в блоке имеют одинаковое количество. Имена в каждом блоке также могут быть отсортированы. (Имена в самих блоках могут быть организованы как B-дерево.)
Если количество имен становится достаточно большим, чтобы блоки дерева B + становились чрезмерно большими, ключ можно превратить в составной ключ, например, (считать, первая буква). При поиске в дереве необходимо сравнивать только количество, чтобы найти все имена с этим количеством. При вставке или поиске определенного имени с заданным количеством можно сравнить полный ключ и включить фильтрацию по префиксу имени.
В качестве альтернативы, вместо составного ключа элементы данных могут указывать на смещения / блоки во внешнем файле, который содержит блоки имен, что будет поддерживать само дерево B + небольшим.
Если блоки btree связаны друг с другом, запросы диапазона могут быть эффективно реализованы путем поиска начала диапазона, а затем следуя указателям блоков на следующий блок, пока не будет достигнут конец диапазона. Это позволит вам эффективно реализовать «найти все имена с количеством от 10 до 20».
Как отмечалось в других ответах, СУБД - это предварительно упакованный способ хранения списков, которые не помещаются в память, но я надеюсь, что это дает представление о структурах, используемых для решения проблемы.