У меня есть хранимая процедура, которая имеет дело с добавлением узлов в дереве.В основном структура таблицы:
id INT PRIMARY
label VARCHAR(1) /* the value of the node which is a character */
parent_id INT /* id of the parent node */
Вот моя хранимая процедура:
/*
takes a word, and adds every character in to the table
where every character is a child of the previous character
the first character of every word is a child of the root
*/
CREATE PROCEDURE rule(IN word VARCHAR(255))
BEGIN
/* (parent_id = 0) => child of root */
DECLARE pid INT DEFAULT 0; /* parent id */
DECLARE npid INT DEFAULT 0;
DECLARE strlength INT;
DECLARE j INT DEFAULT 1;
DECLARE query_count INT DEFAULT 0;
DECLARE active_char VARCHAR(1);
SET strlength = LENGTH(word);
/* loop through the word */
WHILE j <= strlength DO
/* get a single character from word */
SET active_char = SUBSTR(word,j,1);
/* if the character doesn't already exist, insert it */
SELECT COUNT(*) INTO query_count FROM tree
WHERE parent_id = pid AND label = active_char;
IF (query_count = 0) THEN
INSERT INTO tree (label, parent_id)
VALUES (active_char,pid);
END IF;
/* Set the new parent id */
SELECT id INTO npid FROM tree
WHERE label = active_char AND parent_id = pid;
SET pid = npid;
SET j = j + 1;
END WHILE;
END //
Я уверен, что есть несколько настроек, которые я могу сделать, чтобы сделать процедуру немного более эффективной, ноЯ не могу придумать ничего, что могло бы значительно сократить необходимое время.
Я имею в виду много слов, что означает, что эта процедура выполняется пару раз 100 000 раз, что, в свою очередь, означает много вставок имного запросов.Это занимает часы, может быть, дни (не уверен, потому что я перестал ждать и остановил процесс).
Дело в том, что я не думаю, что могу сделать массовую вставку, потому что каждая вставка зависит от предыдущей вставки.
Мне было интересно, есть ли какой-нибудь способ создать виртуальную таблицу, которая хранитсяв оперативной памяти, чтобы быстро выполнить все эти операции, а затем просто сохранить результат в фактической таблице.
В настоящий момент единственное возможное решение, о котором я могу подумать, - это построить дерево на PHP, а затем выполнитьосновная вставка.Я думаю, что это должно быть быстрее, но я не уверен, до какой степени.
Любая помощь будет очень признательна.
Спасибо.