Я был среди "всех, кто упускает очевидное" здесь.
Просто используйте любой быстрый поиск ключа / значения, который вам доступен. И посмотрите все возможные значения. Это небольшой набор, и он не займет много времени. Все, кроме хранения ваших данных 6 раз, будет медленнее.
Если бы у вас был большой возможный словарный запас, тогда мой предыдущий ответ был бы уместным.
Вот мой старый (и плохой) ответ.
Я бы поместил их в базу данных с несколькими объединенными индексами. Сколько вам решать.
Как минимум, у меня было бы 2. У меня был бы индекс на (col1, col2, col3, col4, col5, col6)
и (col4, col5, col6, col1, col2, col3)
. Это будет означать, что, независимо от того, какой столбец отсутствует, будет способ получить ваши данные и просмотреть только максимум 1/1000 записей. Если хотите, вы можете вместо этого индексировать (col1, col2, col3, col4, col5, col6)
, (col3, col4, col5, col6, col1, col2)
и (col5, col6, col1, col2, col3, col4)
, чтобы ограничить поиск до 1/10000 данных. Это использует вдвое больше памяти, но в 10 раз быстрее. (Предупреждение, я не буду гарантировать, что MySQL успешно определит, какой индекс он должен использовать. Я надеюсь, что другие базы данных сделают это правильно, но не проверили его.)
Если вы хотите не использовать базу данных, вы можете использовать сбалансированные двоичные деревья в точности так, как я предлагал использовать индексы выше. Для любого поиска выберите дерево, в котором отсутствует пропущенный элемент как можно глубже. Сделайте поиск диапазона. Фильтруйте возвращенные данные только по интересующим вас строкам. Фактически это именно то, что хорошая база данных должна делать выше с этими индексами.