@NasherDenn
Инженер NDT PAUT

Как организовать поиск в БД с 1000 таблиц?

Есть очень много таблиц (>10.000), в каждой от 1 до 50 строк, в каждой разное количество столбцов от 10 до 30 и разная комбинация названий столбцов. Как правильно организовать БД для более быстрого поиска чем обыкновенный перебор?
Пробовал обыкновенный запрос через SELECT - очень долго. Можно ли ускорить поиск через индексацию? Или ещё как-нибудь?
  • Вопрос задан
  • 234 просмотра
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev
Седой и строгий
Даю совет: базу данных, в которой "есть очень много таблиц (>10.000), в каждой от 1 до 50 строк" нужно удалять, а того, кто её проектировал, увольнять с позором.
Ответ написан
@rPman
То что базу надо правильно проектировать уже сказали.

Правильный ответ на твой зависит от того, какие именно запросы поиска нужно делать и что в результате должно получиться. Как часто нужно делать такие запросы. Какой размер базы данных. Как часто изменяются данные, нужно ли оперативно отслеживать эти изменения чтобы поиск давал всегда оперативные данные.

Теперь, если основываться на моих телепатических способностях, могу предположить что каждая таблица - это отчет, структуры таблиц либо одинаковые либо имеют общие поля, по которым может понадобиться проводить поиск. Поиск нужно проводить строгим сравнением (т.е. ищем не подстроку а конкретное значение) в ответ нужно получить таблицу, строку и колонку, в которой было искомое значение. Поиск нужно проводить регулярно но не часто (например раз в сутки) либо допускается отставание результатов поиска на этот срок (т.е. можно искать данные не новее вчерашнего дня). Могу предложить решение.

Простенькой программой, анализирующей структуру базы данных (списки таблиц и колонок в них) можно написать приложение, которое все все данные во всей базе собирает в одну большую кеш таблицу, полностью ее перезаполняя.

Таблица может иметь вид: tablename, columnname, id, value (если это критично, вместо одного текстового поля value можно заводить по одному на каждый тип или представление данных, в форме, по которой проводится поиск), при заполнении, индексов у этой таблицы быть не должно, в этом случае заполнение будет максимально оперативным (особенно если ее физическое размещение будет на другом носителе, смотри как в твоей базе данных создавать таблеспейсы или иные методы), допускается использование другой базы данных, в каком то смысле это даже более оправдано. Пустые значения (null и под задачу '' и может даже 0) можно сюда не добавлять, если поиск таких значений не актуален. Так же можно пропускать какие то таблицы, поля и даже записи по каким то критериям, если они могут быть не важны для анализа (например фильтрация по дате).

После заполнения в таблицу нужно добавить индексы по value, и опционально по columnname/tablename. Теперь простой запрос select * from эта_cache_table where value=? даст максимально быстро результат.

p.s. если речь идет о простом анализе данных в базе, например изучение структуры человеком, который разбирается в sql, можно очень простым способом сделать sql дамп всей базы и искать нужные значения простым поиском по строке (осторожно, в зависимости от базы данных, символы в строках могут экранироваться различными способами), так же можно поэкспериментировать с разными методами экспорта данных (например почти все базы имеют утилиты экспорта в csv)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы