Как оптимизировать этот MySQL Query?на nginx и fastcgi - PullRequest
1 голос
/ 06 марта 2012

У меня есть веб-приложение, построенное на платформе воспламенителя кода поверх nginx, fastcgi и mysql

У меня есть таблица выплат.структура таблицы - здесь .

. В этой таблице хранятся названия стран, значения perminutecost и почти 56 373 записей.


на главной странице, естьформа, которая запрашивает у пользователя номер его мобильного телефона для получения стоимости за разрешенную стоимость. Кстати, я использую функцию автозаполнения в качестве типов пользователя в

. Вот мой внутренний код:

$ str содержит вводимые пользователем данные.(номер мобильного телефона)

$ ret = true;$ count = 3;

        while($ret){
            $sub = substr($str,0,$count); //9053
            $ret = R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30");
            $count++;
        }

        $sub = substr($str,0,$count-2);

        $ret =  R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30");

        return $ret[0];

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

я сделал несколькоизменения в nginx и fastcgi для расширения пределов времени ожидания

, но когда слишком много людей используют службу одновременно, использование процессора mysqld становится более 100%,

как я могу улучшить этот алгоритм?

спасибо.

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

Вы можете создать другую таблицу, в которой будут храниться префиксы для ваших префиксов. Например, если запись в вашей таблице выплат имеет префикс = 12345, ваша таблица префиксов будет иметь 5 связанных строк: 1, 12, 123, 1234 и 12345. Каждая запись будет связана с исходной записью внешним ключом. Для поиска вы найдете точное соответствие в prefixTable, а затем присоединитесь к таблице выплат, чтобы получить информацию о выплате.

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

3 голосов
/ 06 марта 2012

Я думаю, что просто как '$ sub%' было бы быстрее, чем регулярное выражение, и для вашей базы данных было бы лучше, если бы они не выполнялись автоматически до 3 чисел.

Опубликовать пример вывода SQL, если вы поместите «EXPLAIN» в начале sql вне этого скрипта.

1 голос
/ 06 марта 2012

Преобразовать столбец Prefix из TEXT в столбец VARCHAR с минимальной требуемой длиной и добавить индекс для столбца Prefix.

Затем вместо регулярного выражения используйте LIKE с подстановочным знаком %:

SELECT Destination, PerMinuteCost
FROM `payout` WHERE `Prefix` LIKE '$sub%'
LIMIT 0 , 30
...