Немного О Проектировании Баз Данных Для Поисковой Системы

Без базы данных, даже без нескольких кардинально разных, такой проект невозможен.

Поэтому я уделю этому вопросу немного времени.

Итак, как минимум, вам понадобится база данных, которая обслуживает обычные «плоские» («2D») данные – т. е.

полю данных присвоен определенный идентификатор ID. Почему поле данных, которое я рассматриваю, является таковым? Потому что:

  • выбор осуществляется только по полю ID – поиск данных не производится.

    Для этого существуют специализированные индексы - иначе от таких объёмов информации толку будет мало

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

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

Основными операциями для таких таблиц базы данных являются:

  • выбор по ID
  • прочитать всю базу данных последовательно (в память или хэш)
  • обновить запись по идентификатору
  • вставьте новый в конце, получите идентификатор
Я счел оптимальным использовать таблицы «типа страницы», где данные хранятся, записываются и считываются с диска в страницах.

Каждая страница имеет фиксированное количество записей.

Все довольно просто, если я заранее знаю фиксированный размер записи — тогда таблица будет работать еще быстрее, однако даже в случае изменения размера записи при обработке ничего существенно не меняется.

Обновления и дополнения в конец производятся внутри страницы в памяти, затем страница записывается на диск.

В табличном файле страницы хранятся последовательно.

Возникает вопрос: как обновить записи в середине таблицы при изменении их размера - ведь если вся таблица больше 10-20-200 ГБ, то копирование половины таблицы во временный файл, а затем обратно будет занять часы? Я перенес этот вопрос на файловую систему, разбив все страницы на блоки.

Один блок – один файл на диске, количество файлов в одной таблице не ограничено.

В каждом файле хранится последовательно ограниченное фиксированное количество страниц.

Тогда если мне нужно обновить запись в середине таблицы, то мне нужно изменить только 1 файл гораздо меньшего и зачастую ограниченного размера.

Я взял на себя ответственность за то, чтобы не заставлять файловую систему делать глупости типа сначала писать в начало, потом в конец, потом снова в начало.

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

Ну и конечно вся система модулей поисковой системы построена исходя из того, что записать 1000 записей в конец быстрее, чем 1 в начало - поэтому при записи в начало иногда проще сделать копию стол.

Хорошо, мы решили это с помощью обычных таблиц.

Сейчас описанная база данных очень хороша, в частности, она обрабатывает в процессе поиска 35 ГБ текстовых фрагментов, со случайной выборкой.

Но есть и ограничения - хранить соответствие в такой таблице: для каждого слова список документов, в которых это слово было найдено (вместе с дополнительной информацией), практически невозможно - для каждого слова будет очень много документов, и соответственно объем будет огромным.

Итак, какие операции следует проделать с такой базой данных:

  • последовательный выбор от начала списка по нужному произвольному слову и до тех пор, пока не надоест
  • Хорошо бы под слово поменять список документов, но тут можно сделать финт - просто вставить в конец базы
Как обновить такой индекс? Очевидно, что если индекс пуст и мы начинаем вставлять в него списки документов, начиная с первого слова и заканчивая последним, мы будем писать только до конца файла.

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

Тогда процедура последовательного чтения будет следующей: перемещаемся в файле в начало списка по нужному слову и читаем последовательно, пока не начнется список для следующего слова: 1 ищем, а минимально необходимое количество чтений - win (здесь я специально не считаю операции самой файловой системы — их можно отдельно оптимизировать) Теперь, очевидно, когда мы хотим добавить в индекс информацию о вновь проиндексированных страницах, мы можем аккумулировать новую информацию отдельно, открыть текущий индекс для чтения, а новый, создаваемый для записи, и читать-записывать последовательно сливаясь с информацией.

что нужно добавить, начиная с первого слова и заканчивая последним.

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

Полный контент и список моих статей в поисковике будут обновляться здесь: http://habrahabr.ru/blogs/search_engines/123671/ Теги: #БД #собственная база данных #Поисковые технологии

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.