Нужно произвести полнотекстовый поиск как по заголовкам товаров, так и по заголовкам категорий. В случае совпадения будет возвращена выборка id этих товаров.
Вот поиск по заголовкам категорий
SELECT `id` FROM `object` obj
JOIN `category` cat ON MATCH(cat.`title`) AGAINST (?)
JOIN `obj2cat` obj2 ON obj2.`cat` = cat.`tid`
WHERE obj.`id` = obj2.`obj`
Выполняется за сотые доли секунды
Поиск по заголовкам товаров
SELECT `id` FROM `object` obj WHERE MATCH(obj.`title`) AGAINST (?)
Также выполняется быстро
Но если их объединить
SELECT `id` FROM `object` obj
JOIN `category` cat ON MATCH(cat.`title`) AGAINST (?)
JOIN `obj2cat` obj2 ON obj2.`cat` = cat.`tid`
WHERE (
obj.`id` = obj2.`obj`
OR
MATCH(obj.`title`) AGAINST (?)
)
Время выполнения составляет пару десятков минут :(
Где я ошибся? Индексы на месте
EXPLAIN последнего запроса
array (
0 =>
array (
'id' => 1,
'select_type' => 'SIMPLE',
'table' => 'cat',
'type' => 'fulltext',
'possible_keys' => 'PRIMARY,title',
'key' => 'title',
'key_len' => '0',
'ref' => '',
'rows' => 1,
'Extra' => 'Using where',
),
1 =>
array (
'id' => 1,
'select_type' => 'SIMPLE',
'table' => 'obj',
'type' => 'ALL',
'possible_keys' => 'PRIMARY',
'key' => NULL,
'key_len' => NULL,
'ref' => NULL,
'rows' => 4604,
'Extra' => '',
),
2 =>
array (
'id' => 1,
'select_type' => 'SIMPLE',
'table' => 'obj2',
'type' => 'ALL',
'possible_keys' => 'obj',
'key' => NULL,
'key_len' => NULL,
'ref' => NULL,
'rows' => 14676,
'Extra' => 'Using where',
),
)