Mysql INNER JOIN + MATCH AGAINST: как ускорить - PullRequest
0 голосов
/ 20 июня 2020

Мне интересно, как ускорить запрос ниже. Я использую разные INNER JOIN для извлечения содержимого, принадлежащего разным категориям узлов. Очевидно, что на txt_for_search есть индекс FULLTEXT.

SELECT DISTINCT(c.id_content)) as tot, c.* FROM Contents c 
  INNER JOIN (SELECT id_content FROM Content_Nodes 
    WHERE id_node IN (139)) cn1 ON c.id_content=cn1.id_content 
  INNER JOIN (SELECT id_content FROM Content_Nodes 
    WHERE id_node IN (6)) cn2 ON c.id_content=cn2.id_content 
  INNER JOIN (SELECT id_content FROM Content_Nodes 
    WHERE id_node IN (389,399)) cn3 ON c.id_content=cn3.id_content  
WHERE MATCH(txt_for_search) AGAINST ('my query'  IN BOOLEAN MODE)  and  DATEDIFF(NOW(),to_date)<=365  and enabled=1

Если я сделаю этот запрос, он будет очень быстрым

SELECT DISTINCT(c.id_content)) as tot, c.* FROM Contents c  
WHERE MATCH(txt_for_search) AGAINST ('my query'  IN BOOLEAN MODE)  and  DATEDIFF(NOW(),to_date)<=365  and enabled=1

Даже SELECT, связанный с INNER JOIN, очень быстр.

Вместе мне нужно ждать больше 100 секунд ...

1 Ответ

0 голосов
/ 20 июня 2020

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

Я не знаю, лучший ли он. Я бы предпочел, чтобы ВНУТРЕННИЕ СОЕДИНЕНИЯ содержали все в одном запросе, но я не могу найти другое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...