![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
fuser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.1.2009 Репутация: нет Всего: -1 |
Есть таблица, уже большая – порядка 16 тыс строк, база медленно но постоянно увеличивается.
Первый столбец ID – порядковый номер записи, есть разрывы. Потом столбцы с описанием – для вопроса эти столбцы не важны, и есть последний столбец YES – значение либо 0 либо 1, разрешено для показа – 1, не разрешено – 0. Есть запрос –
выбор последних 10 штук по ID и разрешенных к показу - YES=1 далее эти 10 строк просто через цикл рисуются на страничке, и мы видим 10 последних позиций с их описаниями, характеристиками и т.г. все работает как нужно. Проблема следующая – хостер написал письмо, что такой запрос сильно грузит базу и долго обрабатывается и просит его оптимизировать, иначе отключит базу. Я что то пока не могу придумать что и как сделать. То есть мне нужно выбрать 10 последних (ID) разрешенных (YES) записей, а потом их показать на страничке. |
|||
|
||||
bars80080 |
|
|||
![]() прапор творюет ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Завсегдатай Сообщений: 12022 Регистрация: 5.12.2007 Где: Königsberg Репутация: 9 Всего: 315 |
ерунда, не может такой запрос сильно грузить базу. это один из самых простых и быстрых
тем более для 16000 записей что-то вы не договариваете выложите структуру таблицы (show create table table_name) |
|||
|
||||
fuser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 названия столбцов в базе другое ![]() вот текст от хостера - # 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 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
fuser, выполни запрос
если индекс не помещается полностью в память(зависит от настроек сервера БД), то будет работа с диском. Не ускоряющая выполнение запроса. Совсем. |
|||
|
||||
fuser |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 8.1.2009 Репутация: нет Всего: -1 |
вот результат запроса
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, но что то не совсем понял что с этим делать.. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 14 Всего: 260 |
можно добавить индекс по `Yes`, раз он уж у тебя используется.
но не факт, что поможет - если распределение значений мало(положим, всего два значения "0" и "1") и обоих значений примерно поровно, оптимизатор скорее всего проигнорирует этот индекс. Добавлено через 2 минуты и 58 секунд если бы использовался твой primary key, это было бы видно по результату выполнения explain. возможно, primary key не используется по причине нехватки памяти под индекс(точнее, по причине ограничения максимального выделения памяти в настройках). возможно, это влияние внутреннего оптимизатора. создай тестовую таблицу, как копию этой, но с меньшим количеством записей(например, 1000). Выполни explain своего запроса. будет использоваться primary индекс или нет? |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Базы Данных | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |