Более быстрый способ сделать отдельные вставки? - PullRequest
1 голос
/ 05 мая 2011

У меня есть хранимая процедура, которая имеет дело с добавлением узлов в дереве.В основном структура таблицы:

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, а затем выполнитьосновная вставка.Я думаю, что это должно быть быстрее, но я не уверен, до какой степени.

Любая помощь будет очень признательна.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 мая 2011

Некоторые мысли:

  1. «Сокращение времени» означает, что вы должны показать нам схему, индексы, запросы и EXPLAIN (каждый из операторов в процедуре).
  2. Используйте INSERT IGNORE вместо пары SELECT/INSERT, которую вы используете сейчас.
  3. Вам не нужно SELECT выдавать ID - используйте LAST_INSERT_ID()
  4. Зачем выбирать в npid, а затем копировать в pid? Просто выберите в pid.
0 голосов
/ 05 мая 2011

Хотя я боюсь, что не могу утверждать, что использовал его сам, передача данных в хранимую процедуру в виде XML и обработка ее как , описанная здесь , может показаться разумным подходом. Нотабене MySQL 5.1 или выше.

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