Помогите оптимизировать SELECT

vxc

Новичок
Помогите оптимизировать SELECT

Помогите оптимизировать запрос. Посмотрел по логам - он самый медленный.

Есть таблица с 24к строк.
PHP:
CREATE TABLE IF NOT EXISTS `data` (
  `id` int(6) NOT NULL auto_increment,
  `number` int(7) NOT NULL default '0',
  `text` text NOT NULL,
  `rate` int(6) NOT NULL default '0',
  `date` varchar(20) default NULL,
  `time` varchar(5) NOT NULL default '',
  KEY `rate` (`rate`),
  KEY `number` (`number`),
  KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=23737 ;
Организована "лента новостей", т.е. выводится 30 элементов подряд.
Идет запрос типа:
PHP:
SELECT id,number,rate,date,time from data ORDER by id DESC limit 21000,30;
И соответственно когда у Limit первое число не маленькое, то время запроса от 0.1 до 1 секунды. Можно как-нибудь оптимизировать?
Будет ли правильнее использовать конструкцию
PHP:
SELECT id,number,rate,date,time from data where id<20130 AND id>20100 ORDER by id DESC
Update тоже не очень радует
PHP:
UPDATE data SET rate='6921'  where (number='405941');
Можно ли как-нибудь улучшить ситуацию?
Заранее благодарен.
 

.des.

Поставил пиво кому надо ;-)
А что часто смотрят 700-ю страницу новостей?
Обычно оптимизировать надо не самый медленный запрос, а запрос который по совокупности время*количество вызовов наибольшее.
 

vxc

Новичок
Там не совсем новости, так что 700ую страницу просматриваю совсем чуть-чуть реже чем вторую:)
 

vxc

Новичок
честно говоря по этой ссылочке не нашел ответа((
 

dimagolov

Новичок
как не нашел? русского языка не понимаешь?

коротко: 3 случая: начало списка (ORDER DESC LIMIT 0-100, 30), конец (ORDER ASC LIMIT 0-100, 30), середина (см.ниже)

середину выбирай по id, чтобы в выборку попадало не более сотни записей за раз.
 

Rosco

Новичок
А если бы id был первичным ключом, проблем с тормозами бы не было...
 

.des.

Поставил пиво кому надо ;-)
Это с какой стати?

Запрос ORDER BY key ASC|DESC LIMIT 100 OFFSET BIG_N тормозить будет всегда.
 
Сверху