MySQL 8 - Оптимизация запроса FIND_IN_SET - PullRequest
0 голосов
/ 01 мая 2020

У меня есть таблица, которая хранит информацию в столбце json с идентификаторами для других таблиц:

CREATE TABLE user_alerts (
   id INT NOT NULL AUTO_INCREMENT,
   user_id INT UNSIGNED NOT NULL,
   criteria JSON NULL DEFAULT NULL,
PRIMARY KEY (id)
)

INSERT INTO user_alerts (user_id, criteria) VALUES (101, '{"salaries": "1,2,3,4,5,6,7,8,9,10,", "industries": "1,37,41,2,39,3,4,5,6,7,8,9,33,10"}');

Я выполняю соединение слева, чтобы получить имена для этих идентификаторов следующим образом:

SELECT DISTINCT a.id, 
       Group_concat(DISTINCT(i.name) SEPARATOR ', ') industries, 
       Group_concat(DISTINCT(s.name) SEPARATOR ', ') salaries    
FROM   alerts a 
LEFT JOIN industries i ON Find_in_set(i.id, Json_unquote(Json_extract(a.criteria,'$.industries'))) 
LEFT JOIN salaries s  ON Find_in_set(s.id, Json_unquote(Json_extract(a.criteria, '$.salaries'))) 
WHERE  user_id = 101

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

Есть ли способ оптимизировать этот запрос или рассмотреть другой метод?

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