Как управлять SQL-запросом со многими объединениями в поисковой системе, например, эластичной? - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть SQL-запрос, в котором есть как минимум 6 соединений.Этот запрос занимает 10 минут или выше для выполнения.Прямо сейчас я использую sphinx и просто устанавливаю источник из этого SQL-запроса.Но у меня проблема с переиндексацией.

Одно из объединений - это соединение со словарной таблицей, которая обновляется очень часто.Я должен переиндексировать источник после каждого обновления словаря.Но я не хочу обновлять весь индекс.

Например:

это запрос SQL:

SELECT m.col1, m.col2.m.col3, d.col1 FROM MainTable m JOIN SupportTable t1 JOIN SupportTable t2 JOIN SupportTable t3 JOIN DictionaryTable d

Когда кто-то обновляет DictionaryTable Я хочу обновить только эту частьиндекс, который зависит от обновленной строки.

Моя цель - интерфейс для моих костюмов в реальном времени.Размер базы данных очень большой.

Что я могу сделать, чтобы ускорить мой аналитический запрос?Должен ли я использовать поисковые системы и создавать механизмы переиндексации или использовать более подходящие технологии?

1 Ответ

0 голосов
/ 27 сентября 2018

Похоже, что индекс SPhinx Real Time может подойти.http://sphinxsearch.com/docs/current.html#rt-indexes

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

Но вы можете обновить только все поля в документе.Невозможно просто обновить d.col1 для большого количества документов, потребуется предоставить все данные для всех полей (и атрибутов) для всех затронутых документов.

Однако вы можете просто обновить выбранные атрибуты документов, не касаясь полей и / или других атрибутов.


Другая идея состоит в том, чтобы вместо одного большого индекса разбить его на биты, то есть «осколить» индекс.Вы даже можете использовать распределенный индекс, чтобы упростить запрос всех фрагментов одновременно.(т. е. для приложения, в котором он видит только один индекс, вам не нужно вручную искать отдельные шарды) http://sphinxsearch.com/files/tutorials/sphinx_config_tips_and_tricks.pdf

... таким образом можно обновлять шарды по мере поступления.Т.е. вместо одного «10-минутного» запроса, разделите его на 4 фрагмента и получите гораздо меньшие обновления.(ранжированные запросы могут даже использоваться для разбиения на множество небольших запросов, а не на один 2,5-минутный запрос) http://sphinxsearch.com/docs/current.html#ranged-queries

...