Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оптимизация запроса MySql+PHP, улучшить скорость выборки 
:(
    Опции темы
bazzjr
Дата 19.4.2009, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: нет
Всего: 6



Всем прива.

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

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 тыс записей, и выборка и построение происходит исключительно медленно!
Что можно предпринять, для того чтобы уменьшить время выборки из базы???


Это сообщение отредактировал(а) bazzjr - 19.4.2009, 12:44
PM MAIL ICQ   Вверх
bars80080
Дата 19.4.2009, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



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

какой смысл в этом коде?
PM MAIL WWW   Вверх
bazzjr
Дата 20.4.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: нет
Всего: 6



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

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

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

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

Это сообщение отредактировал(а) bazzjr - 20.4.2009, 01:45
PM MAIL ICQ   Вверх
Kirsan
Дата 20.4.2009, 07:07 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.11.2008
Где: г.Волжский, Волго градская обл.

Репутация: нет
Всего: 1



Для начала, как Вам уже сказали, нужно вызов функции mysql_query() вынести из цикла while. Спроектируйте запрос так, чтобы получить все нужные данные одной выборкой.
PM ICQ   Вверх
bars80080
Дата 20.4.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 9
Всего: 315



ну, один, не один, можно и два-четыре сделать, но не тысячу же

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

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

Код

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


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

Это сообщение отредактировал(а) bars80080 - 20.4.2009, 09:31
PM MAIL WWW   Вверх
bazzjr
Дата 20.4.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: нет
Всего: 6



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

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

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

Код

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


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

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

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

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

Думаю скорей всего прийдется разбивать на другие таблицы, чтобы снизиить кол-во выборки и улучшить скорость.
PM MAIL ICQ   Вверх
bazzjr
Дата 21.4.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: нет
Всего: 6



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

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


PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1723 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.