Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите построить запрос MYSQL (Сергей) 29/09/2008 - 17:08:46
      Re: Помогите построить запрос MYSQL (Антон) 29/09/2008 - 17:35:59
      Re: Помогите построить запрос MYSQL (bac) 30/09/2008 - 01:18:32

> Original message text:
> From: Сергей - 29/09/2008 - 17:08:46
> Subject:Помогите построить запрос MYSQL
> -----------------
> Хостер отключил сайт за перегруз базы данных.
> Сам я программист PHP. Но сейчас столкнулся с проблемой в MYSQL.
> Требуется проконсультировать по очень проблемному
> запросу.
>
> Есть две таблицы pictures и categories.
> В первой 3500 записей, во второй около 30.
>
> Делается запрос картинки, плюс сразу же
> предыдущей и следующей из этой же категории.
>
> И того, хостер говорит, что просматривается более
> 100 ТЫСЯЧ строк. И отключил меня.
>
>
> ВОТ САМА ПРОБЛЕМА
>
> Проблемный запрос
>
> Время исполнения, секунд - 15
> Кол-во просмотренных строк - 189104
> Запрос:
> -------
> use 1gb_supertest4;
> SELECT P.*, max(Prev.id_pic) as prev, min(Next.id_pic) as next FROM
> pictures P
> LEFT JOIN pictures Prev on (Prev.category_ind=P.category_ind
> and Prev.id_pic<P.id_pic)
> LEFT JOIN pictures Next on (Next.category_ind=P.category_ind
> and Next.id_pic>P.id_pic)
> WHERE P.id_pic='4154' GROUP BY P.category_ind;
>
>
>
> Структура таблиц
>
> CREATE TABLE `categories` (
> `category_ind` int(11) NOT NULL auto_increment,
> `category_name` varchar(30) NOT NULL default '',
> `category_title` varchar(30) NOT NULL default '',
> `category_desc` text NOT NULL,
> `num` int(16) default '0',
> `loads` int(16) default '0',
> PRIMARY KEY (`category_ind`)
> )
>
>
> CREATE TABLE `pictures` (
> `id_pic` int(11) NOT NULL auto_increment,
> `category_ind` int(11) NOT NULL default '0',
> `category_name` varchar(30) NOT NULL default '',
> `file_name` varchar(30) NOT NULL default '',
> `name_pic` varchar(30) NOT NULL default '',
> `description` text NOT NULL,
> `added_by` varchar(30) NOT NULL default '',
> `type` int(11) NOT NULL default '0',
> `loads` int(16) default '0',
> `total_loads` int(11) NOT NULL default '0',
> `time` int(11) NOT NULL default '0',
> PRIMARY KEY (`id_pic`),
> KEY `category_ind` (`category_ind`),
> KEY `type` (`type`),
> KEY `added_by` (`added_by`)
> )
>
>


From: bac - 30/09/2008 - 01:18:32
Subject:Помогите построить запрос MYSQL
-----------------
Начнем с простого
1. В вашем запросе используется только таблица pictures, описание остальных таблиц не имеет отношения к заданному вопросу.
2. В Вашем запросе совершенно не нужная ГРУППИРОВКА, т.к. выбирается и так только одна категория
3. И конечно же обрабатывается не мерянное число записей (в вашем случае почти 190 тыс.)
Я предлагаю решить поставленную задачу не одним а несколькими запросами. Я думаю они на вашем варианте должны выполнится меньше чем за 0.01 сек
SET @ip:=4154;
SET @prev:=NULL;
SET @next:=NULL;
SELECT @ci:=category_ind FROM pictures WHERE id_pic=@ip;
SELECT @prev:=id_pic FROM pictures WHERE category_ind=@ci AND id_pic<@ip ORDER BY id_pic DESC LIMIT 1;
SELECT @next:=id_pic FROM pictures WHERE category_ind=@ci AND id_pic>@ip ORDER BY id_pic ASC LIMIT 1;
SELECT @ip id_pic, @ci category_ind, @prev prev, @next next;


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
34187



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |