@wjkwza

Как хранить номера авто казахстанского учета в базе данных чтобы максимально быстро найти номер в БД?

номера в формате 111AAA11(новые) или A111AAA(старые)
если убрать 11 в конце и А в начале (признак региона)
остается 111AAA

26 букв англ.алфавита, в 3 ряда 26^3=17576 плюс умножить на 1000 получаем 17,5 миллионов элементов на БД одного региона (регионов 20) номеров нового образца (есть еще старые)

сам думал хранить так:
преобразовать буквы в ASCII и добавить цифры,

пример: AAA111 656565111 (656 565 111)

и перед каждым запросом типа 123ABC12

сначала определить регион и БД для региона, потом буквы в ASCII + цифры номера и сделать запрос в БД

все что я знаю это поиск чисел быстрее поиска строк

но мне кажется даже это слишком громоздкое решение и я в силу своей некомпетентности не могу даже правильно загуглить, ChatGPT советует хэшы и индексирование

Доп.инфо: Автомобилей в Казахстане около 5 миллионов и допустим 1 миллион номеров будет храниться в БД в начальное время
Насчет стека: я рад любому стеку, но сам пока только на Pythonе умею
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
@Everything_is_bad
1. Тег "Оптимизация SQL-запросов", значит у тебя СУБД? Какая?
2. Ты придумал себе проблему на ровном месте, 5 миллионов не сильно много, можно поднять тестовый стенд и проверить как будет работать без индексов, потом добавить индекс по умолчанию
3. Если поиск по полному номеру, то практически любой индекс будет работать очень быстро, если по подстроке, то начинается куча нюансов, тут уже надо отталкиваться от user story
4. Если не устраивает, то читаешь какие виды индекса есть у данной СУБД, экспериментируешь, смотришь планы запросов, оптимизируешь и т.п
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Тебе ничего не надо придумывать. Все уже придумано и база умеет индексировать.

create table autonumbers(autonumber varchar(30), region varchar(30));

create index idx1 on autonumbers(autonumber);
create index idx2 on autonumbers(region );


Запросы:
поиск номеров в регионе (индексированный)
select .... where region = 'Астана';

точный поиск номера по полному совпадению

select .... where autonumber= '111AAA11';


все что я знаю это поиск чисел быстрее поиска строк


Это слабое утверждение для баз данных. БД это на 80% IO bounded приложение
и его нагрузка будет зависеть от дисковой подсистемы и от удачного расположения
искомых строк в блоках БД.

Мой личный опыт эксплуатации БД Oracle например показывает что практически
нет разницы между varchar / number. Хотя многие DBMS (Postgresql) поддерживают
примитивные типы данных, но когда строка (datarow) длинная - то практически
безразлично будет ли у тебя integer, biginteger, decimal.

Важнее сделать систему просто правильной, а ужимать и утрамбовывать инфу в примитивы
это - более поздняя оптимизация. Попробуй загрузи свои номера в макет и поэкспериментируй.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы