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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите оптимизировать запрос 
:(
    Опции темы
fuser
Дата 23.5.2009, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.1.2009

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



Есть таблица, уже большая – порядка 16 тыс строк, база медленно но постоянно увеличивается.
Первый столбец ID – порядковый номер записи, есть разрывы.
Потом столбцы с описанием – для вопроса эти столбцы не важны, и есть последний столбец YES – значение либо 0 либо 1, разрешено для показа – 1, не разрешено – 0.
Есть запрос – 
Код

$rezultat=mysql_query("SELECT * FROM (имя таблицы) WHERE YES=1 ORDER BY ID DESC LIMIT 0, 10");

выбор последних 10 штук по ID и разрешенных к показу - YES=1
далее эти 10 строк просто через цикл рисуются на страничке, и мы видим 10 последних позиций с их описаниями, характеристиками и т.г.
все работает как нужно.
Проблема следующая – хостер написал письмо, что такой запрос сильно грузит базу и долго обрабатывается и просит его оптимизировать, иначе отключит базу.
Я что то пока не могу придумать что и как сделать.
То есть мне нужно выбрать 10 последних (ID) разрешенных (YES) записей, а потом их показать на страничке.

PM MAIL   Вверх
bars80080
Дата 23.5.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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



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

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



ерунда, не может такой запрос сильно грузить базу. это один из самых простых и быстрых
тем более для 16000 записей

что-то вы не договариваете

выложите структуру таблицы (show create table table_name)

PM MAIL WWW   Вверх
fuser
Дата 23.5.2009, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.1.2009

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



вот структура таблицы
это структура с базы на локальной машине, на хосте точно также, поэтому тут кол-во 8618
это старый бэкап просто.

CREATE TABLE `таблица` 
(\n  
`ID` int(11) NOT NULL auto_increment,\n  
`столбец1` text NOT NULL,\n  
`столбец2` text NOT NULL,\n  
`столбец3` int(11) NOT NULL,\n  
`столбец4` text NOT NULL,\n  
`столбец5` text NOT NULL,\n  
`столбец6` text NOT NULL,\n  
`столбец7` text NOT NULL,\n  
`столбец8` text NOT NULL,\n  
`столбец9` datetime NOT NULL,\n  
`столбец10` int(11) NOT NULL default '0',\n  
`YES` int(11) NOT NULL default '0',\n  
`столбец11` text NOT NULL,\n  PRIMARY KEY  (`ID`)\n)
 ENGINE=MyISAM AUTO_INCREMENT=8618 DEFAULT CHARSET=cp1251

названия столбцов в базе другое  smile 

вот текст от хостера - 
# Time: 090522 18:50:07
#........(тут я удалил, текс не важный был)
# Query_time: 2.182784  Lock_time: 0.021461 Rows_sent: 10  
Rows_examined: 9012
.............(тут я удалил, текс не важный был)
SET timestamp=1243003807;
SELECT * FROM (имя таблицы) WHERE YES=1 ORDER BY ID DESC  LIMIT 0, 10;

вот сам текст письма -
Настоятельно просим до ........... оптимизировать приведенный ниже запрос к базе ............, находящейся на Вашем тарифном плане, так как на данный момент запрос регулярно попадает в slow-логи на сервере. Запрос выполняется по большому количеству записей и отрабатывает медленно. Limit работает только по уже упорядоченной базе.


Это сообщение отредактировал(а) fuser - 23.5.2009, 16:43
PM MAIL   Вверх
skyboy
Дата 23.5.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



fuser, выполни запрос
Код

explain
SELECT * FROM (имя таблицы) WHERE YES=1 ORDER BY ID DESC

Цитата(bars80080 @  23.5.2009,  11:02 Найти цитируемый пост)
ерунда, не может такой запрос сильно грузить базу.

если индекс не помещается полностью в память(зависит от настроек сервера БД), то будет работа с диском. Не ускоряющая выполнение запроса. Совсем.
PM MAIL   Вверх
fuser
Дата 23.5.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 8.1.2009

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



вот результат запроса 
Код

explain
SELECT * FROM (имя таблицы) WHERE YES=1 ORDER BY ID DESC


id  select_type table                  type  possible_keys key       key_len ref       rows    Extra 
1   SIMPLE       (имя таблицы)    ALL   NULL               NULL     NULL     NULL 17061    Using where; Using filesort

прочитал про explain, но что то не совсем понял что с этим делать..
PM MAIL   Вверх
skyboy
Дата 23.5.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 14
Всего: 260



можно добавить индекс по `Yes`, раз он уж у тебя используется.
но не факт, что поможет - если распределение значений мало(положим, всего два значения "0" и "1") и обоих значений примерно поровно, оптимизатор скорее всего проигнорирует этот индекс.

Добавлено через 2 минуты и 58 секунд
Цитата(fuser @  23.5.2009,  17:04 Найти цитируемый пост)
не совсем понял что с этим делать

если бы использовался твой primary key, это было бы видно по результату выполнения explain.
возможно, primary key не используется по причине нехватки памяти под индекс(точнее, по причине ограничения максимального выделения памяти в настройках).
возможно, это влияние внутреннего оптимизатора.
создай тестовую таблицу, как копию этой, но с меньшим количеством записей(например, 1000). Выполни explain своего запроса. будет использоваться primary индекс или нет?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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