MySQL: любые предложения по улучшению наилучшего соответствия хранимых процедур - PullRequest
0 голосов
/ 08 июля 2011

Для проекта, над которым я работаю, мне нужно отсканировать ключ для лучшего соответствия. Только эти проверки вызывают большую нагрузку на нашу тестовую систему. У любого есть идея, как я могу улучшить это? Мы уже пробовали временные таблицы и курсоры.

Пример кода, который мы используем:

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
    SELECT COUNT(*) INTO resultCount FROM keytable
    WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength));
    IF (0 < resultCount) THEN
        SELECT ScreeningKey INTO bestMatchScreeningKey FROM keytable 
        WHERE AND ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength));

        /*go to step4*/
        LEAVE Step4;
    END IF;
    SET keyLength = keyLength-1;
END WHILE;

Ответы [ 2 ]

1 голос
/ 08 июля 2011

Вместо использования SELECT COUNT(*) просто используйте IF EXISTS. IF EXISTS может остановить сканирование, как только найдет совпадение, в то время как COUNT(*) необходимо пройти всю таблицу, чтобы подсчитать это количество.

Итак, вы получите что-то вроде: (Я не очень много использую MySQL, поэтому я не уверен в синтаксисе и скопировал ваш синтаксис, который мне не совсем подходит ... )

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
    IF EXISTS (SELECT * FROM keytable
               WHERE I ScreeningKey = (SELECT SUBSTRING(key)-,1,keyLength))) THEN
        SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey;

        /*go to step4*/
        LEAVE Step4;
    END IF;
    SET keyLength = keyLength-1;
END WHILE;
0 голосов
/ 09 июля 2011

Как насчет этого?

Для каждой итерации, где данные не найдены, она переходит в блок исключений (пропуская LEAVE), пока не будет найдена запись.

Это сэкономит вам 2 выбора для каждой итерации.

Примечание. Я добавил LIMIT 1, чтобы исключить возможность выбора, возвращающего несколько строк.

SET keyLength = (LENGTH(key)-1);
WHILE keyLength >=1 DO
BEGIN
    SELECT SUBSTRING(key)-,1,keyLength INTO bestMatchScreeningKey LIMIT 1;
    LEAVE Step4;
EXCEPTION
    WHEN no_data_found THEN
        NULL;
    WHEN others THEN
        RAISE;
END;
    SET keyLength = keyLength-1;
END WHILE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...