У меня относительно большая база данных с 10 миллионами элементов и 25 миллионами отношений тегов к элементам, и я ищу самый быстрый способ найти элементы с наибольшим количеством похожих тегов, например, элемент 1 имеет теги a,b,c
, элемент 2 d,b,c
, элемент 3 d,e,c
, здесь для элемента 1 элемент 2 имеет 2 аналогичных тега, а элемент 3 - 1.
Я пробовал поиск в MySQL следующим образом:
select itemid, count(*) tags
from tags2items
where tagid in (4,173,316,1219,4193,18462,18652,18871,19495,19735)
group by itemid
order by tags desc limit 10;
и это занимает 16 секунд, а запрос с самостоятельным объединением, вероятно, займет еще больше времени.
Я использую Sphinx для полнотекстового поиска с тегом в качестве MVA и запросом типа
SELECT id,(mva=7)+(mva=33)+(mva=129) as sorter
from index
where mva IN (7,33,129)
order by sorter desc limit 10;
занимает около секунды.
Есть ли способ сделать этот поиск быстрее? Может с редисом? БД меняется нечасто, так что хорошо бы иметь какой-то длительный процесс подготовки этого быстрого тега БД.
Если в этом нет особой необходимости, я не хотел бы добавлять такие вещи на основе Java, какasticsearch.