Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > оптимизация запроса MySql+PHP


Автор: bazzjr 19.4.2009, 12:13
Всем прива.

Есть такая таблица:

name  varchar(40) default NULL,
type    varchar(40) default NULL,
index  varchar(11) default NULL,

Есть такой скриптик:

Код

$qr=mysql_query("SELECT * FROM `base` WHERE substring(index, 6, 6) <> '000000' AND `name` LIKE '".$input."%' ORDER BY name",$connect) or die(mysql_error());
while($row=mysql_fetch_array($qr)) 
{
$code0 = substr($row['index'],0,5);
$code1 = substr($row['index'],0,2);

$qcode1=mysql_query("SELECT `name` FROM `base` WHERE LEFT(index, 2) = '".$code1."' AND right(CODE, 11) = '00000000000' ",$connect) or die(mysql_error());

if(substr($row['index'],3,3) != '000' ){
    $qcode2=mysql_query("SELECT `name` FROM `base` WHERE LEFT(index, 5) = '".$code0."' AND right(index, 8) = '00000000' ",$connect) or die(mysql_error());
    $arr_code2=mysql_fetch_array($qcode2); 
    }

$arr_code1=mysql_fetch_array($qcode1); 

$aResults[] = array( "id"=>$row['index'], "value"=>$row['name'], "info"=>$arr_code1['name'], "infoz"=>$arr_code2['name'] );
}



Проблема в том, что в таблице 180 000 тыс записей, и выборка и построение происходит исключительно медленно!
Что можно предпринять, для того чтобы уменьшить время выборки из базы???

Автор: bars80080 19.4.2009, 21:25
это всё из-за лефтов, лайков и неизвестного количества запросов в цикле. жалко сервер, умирает наверное в мучениях

какой смысл в этом коде?

Автор: bazzjr 20.4.2009, 01:44
Цитата(bars80080 @ 19.4.2009,  21:25)
это всё из-за лефтов, лайков и неизвестного количества запросов в цикле. жалко сервер, умирает наверное в мучениях

какой смысл в этом коде?

Смысл прост... Позволить юзеру выбрать из базы нужную ему слово(запись) используя поле input для ввода искомых букв.

Если есть мысли о том как избежать LEFT LIKE, с удовольствием выслушаю smile

Автор: Kirsan 20.4.2009, 07:07
Для начала, как Вам уже сказали, нужно вызов функции mysql_query() вынести из цикла while. Спроектируйте запрос так, чтобы получить все нужные данные одной выборкой.

Автор: bars80080 20.4.2009, 09:30
ну, один, не один, можно и два-четыре сделать, но не тысячу же

ладно, 
Цитата(bazzjr @  20.4.2009,  01:44 Найти цитируемый пост)
Позволить юзеру выбрать из базы нужную ему слово(запись) используя поле input для ввода искомых букв

этой фразе соответствует один запрос:

Код

$sql = 'select * from base where `name` LIKE "%'.$input.'%"';


а остальное что?

Автор: bazzjr 20.4.2009, 09:38
Цитата(bars80080 @ 20.4.2009,  09:30)
ну, один, не один, можно и два-четыре сделать, но не тысячу же

ладно, 
Цитата(bazzjr @  20.4.2009,  01:44 Найти цитируемый пост)
Позволить юзеру выбрать из базы нужную ему слово(запись) используя поле input для ввода искомых букв

этой фразе соответствует один запрос:

Код

$sql = 'select * from base where `name` LIKE "%'.$input.'%"';


а остальное что?

а остальное это некая дополнительная выборка, с помощью которой мы строим список.
Пример:
Искомое слово "Лабинск"
на выходе будет результат.

Лабинск
Краснодарский край,
Лабинский район

Т.е. в данный момент у меня используеться всего одна таблица, и в ней все данные имеют уникальные клочи "INDEX"

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

Автор: bazzjr 21.4.2009, 14:54
Цитата(Kirsan @ 20.4.2009,  07:07)
Для начала, как Вам уже сказали, нужно вызов функции mysql_query() вынести из цикла while. Спроектируйте запрос так, чтобы получить все нужные данные одной выборкой.

Люди помогите, если не сложно дайте хотя бы небольшой намек как это сделать, или если можно код???


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)