2012-03-06 2 views
1

У меня есть веб-приложение, построенное на основе кода воспламенителя в верхней части nginx, fastcgi и mysqlКак оптимизировать этот запрос mysql? на nginx и fastcgi

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

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


на главной странице есть форма, которая просит пользователя ввести свой номер мобильного телефона, чтобы получить perminute cost.Btw я использую функцию автозаполнения в качестве пользовательских типов в

вот мой бэкенд код:

$ ул имеет пользовательский ввод (номер мобильного телефона)

$ в отставке = истина; $ 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]; 

этот код позволяет мне получить perminutecost от номера мобильного телефона. (Таблица имеет только префиксы не все номера сотового телефона)

я сделал некоторые изменения на Nginx и FastCGI расширить границы времени ожидания

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

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

спасибо.

+1

ли REGEX для автозаполнения? Потому что я немедленно удалю это. – Woot4Moo

+0

:) Это мой быстрый код. Теперь я ищу оптимизацию. –

+0

Не могли бы вы опубликовать образец того, что пользователь вводит? Вы предлагаете, чтобы они набрали «0», затем «01», затем «012»? – tristanbailey

ответ

3

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

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

+1

Также добавление какого-то кэширования для последних введенных значений для формы может ускорить выполнение большинства обычных запросов – tristanbailey

+0

Должен ли я сделать это на nginx? –

+0

Что nginx связано с MySQL? –

3

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

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

1

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

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

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

отлично! сделаю это.! –

+0

, если все числа одинаковой длины (или аналогичные), вам может понадобиться только столбец int над varchar, так как все строки varchar в конечном итоге сохраняются как длина данных самой длинной записи. плюс вы не захотите вводить персонажа по ошибке, если вам не нужны пробелы? – tristanbailey

+0

@tristanbailey, значения VARCHAR не сохраняются как длина данных самой длинной записи. Это даже не верно для индексов. Столбцы VARCHAR используют от первого до двух байтов для хранения длины значения для каждой строки. Остальная часть - фактически переменная длина, соответствующая значению. –

Смежные вопросы