SELECT tbl_notice.id, tbl_notice.date, tbl_notice.type, tbl_notice.message, tbl_notice.source_id, tbl_users.username, tbl_users.shortname, tbl_users.some_data
FROM tbl_notice
JOIN tbl_users ON tbl_users.id = tbl_notice.source_id
where tbl_notice.user_id = 1 AND tbl_notice.type = "user"
UNION ALL
SELECT tbl_notice.id, tbl_notice.date, tbl_notice.type, tbl_notice.message, tbl_notice.source_id, tbl_system.systemname, 'SYSTEM', null
FROM tbl_notice
JOIN tbl_system ON tbl_system.id = tbl_notice.source_id
WHERE tbl_notice.user_id = 1 AND tbl_notice.type = "system"
DELIMITER $$
DROP PROCEDURE IF EXISTS extract_params;
CREATE PROCEDURE extract_params()
BEGIN
DECLARE exit_flag INT DEFAULT 0;
DECLARE j JSON;
DECLARE i INT;
DECLARE q VARCHAR(255);
DECLARE t VARCHAR(255);
DECLARE c CURSOR FOR
SELECT CAST(jdoc->'$."name"' AS JSON) FROM t1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET exit_flag = 1;
DROP TEMPORARY TABLE IF EXISTS tmp_123;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_123 (jsn VARCHAR(255)) ENGINE=MEMORY;
OPEN c;
fetch_loop: LOOP
FETCH c INTO j;
IF exit_flag THEN LEAVE fetch_loop; END IF;
IF JSON_TYPE(j) = 'ARRAY' THEN
SET i = JSON_LENGTH(j);
WHILE i > 0 DO
SET i = i - 1;
SET q = CONCAT('$[',i,']');
SET t = JSON_UNQUOTE(JSON_EXTRACT(j, q));
INSERT INTO tmp_123 VALUES(t);
END WHILE;
END IF;
END LOOP;
CLOSE c;
SELECT DISTINCT(jsn) FROM tmp_123;
END$$
сделайте разбиение по диапазону. сохраните и старые ссылки и новая структура с новыми ссылками будет работать. то есть к каждому индексу в старых таблицах добавьте префикс. при обработке старых ссылок добавляете префикс к запрашиваемому индексу и получаете нужную статью.