Здравствуйте.
Есть MySQL база на несколько миллионов строк.
Основная таблица в ней выглядит как:
ID | Text | ... десяток полей-флагов ...
К ней могут (в зависимости от галочек в форме поискового запроса) джоиниться ещё несколько таблиц вида table (ID | Parent_ID | Data).
На сейчас типичный запрос выглядит так:
SELECT * FROM table
JOIN child_table on (table.ID = child_table.Parent_ID)
JOIN child_table2 on (table.ID = child_table2.Parent_ID)
...
WHERE
table.Flag1 = '...'
AND table.Flag2 = '...'
AND child_table.Data = '...'
AND child_table2.Data = '...'
Иногда кроме этих полей-флагов необходимо искать по полю Text в таблице:
SELECT * FROM table
JOIN child_table on (table.ID = child_table.Parent_ID)
JOIN child_table2 on (table.ID = child_table2.Parent_ID)
...
WHERE
table.Flag1 = '...'
AND table.Flag2 = '...'
AND child_table.Data = '...'
AND child_table2.Data = '...'
AND MATCH(table.Text) AGAINST ('....')
Естественно, на таких объемах полнотекстовый поиск от mysql дичайше тормозит. Чтобы избавиться от тормозов, я решил воспользоваться Сфинксом, но столкнулся с проблемой: как в нём правильно выстроить индекс?
То есть:
- должен ли я все эти флаги (в т.ч. из дочерних таблиц) загонять в индекс Сфинкса (через rt_attr_uint, например), и искать все данные именно в нём, или
- я фильтрую в MySQL только по флагам = получаю список айдишников, потом фильтрую в Сфинксе только по тексту = получаю другой список, потом нахожу пересечение этих списков = мой результат, или
- какой-то другой вариант?