"Тяжелая" обратная сортировка

Кощей

if(!$needle) die("ooh");
"Тяжелая" обратная сортировка

Что нужно сделать чтобы улучшить отсортированый вывод с использованием DESC, потому-что такая разница удручает:

SELECT * FROM `$comment_table` WHERE pageid =$pageid AND val =$val AND to_id='$to_id' ORDER BY id LIMIT 0 , 20 = 0.0056 сек

SELECT * FROM `$comment_table` WHERE pageid =$pageid AND val =$val AND to_id='$to_id' ORDER BY id DESC LIMIT 0 , 20 = 1.7257 сек
 

440hz

php.ru
[sql]
CREATE TABLE IF NOT EXISTS `comments` (
`id` int(11) unsigned NOT NULL auto_increment,
`nick` varchar(32) NOT NULL default '',
`text` text NOT NULL,
`date` int(10) unsigned NOT NULL default '0',
`ips` varchar(255) NOT NULL default '',
`post` int(11) NOT NULL default '0',
`user` varchar(16) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `user` (`user`),
KEY `post` (`post`)
) TYPE=MyISAM AUTO_INCREMENT=103810 ;
[/sql]

ИМХО дело не в ASC|DESC

[sql]SELECT *
FROM `comments`
ORDER BY `comments`.`id` ASC
LIMIT 0 , 30
[/sql]
Отображает строки 0 - 29 (103,621 всего, запрос занял 0.0016 сек.)

[sql]SELECT *
FROM `comments`
ORDER BY `comments`.`id` DESC
LIMIT 0 , 30
[/sql]
Отображает строки 0 - 29 (103,621 всего, запрос занял 0.0014 сек.)

---

какеи ключи и типы полей?
 

Кощей

if(!$needle) die("ooh");
440hz
Да, если убрать WHERE ... AND ... AND то время где-то 0.0008 сек
Таблица такая
[SQL]
CREATE TABLE `nuke_pcomments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`user_id` int(11) NOT NULL DEFAULT '0',
`user_name` varchar(256) DEFAULT NULL,
`user_email` varchar(50) DEFAULT NULL,
`host_name` varchar(60) NOT NULL DEFAULT '',
`text` text,
`pageid` int(11) NOT NULL DEFAULT '0',
`val` varchar(200) NOT NULL DEFAULT '0',
`avatar` int(10) NOT NULL DEFAULT '0',
`to_id` int(11) NOT NULL,
`number` float DEFAULT NULL,

PRIMARY KEY (`pageid`,`val`,`to_id`,`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=81096 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=81096 ;



[/SQL]
 

Кощей

if(!$needle) die("ooh");
Когда неиспользую условия то разницы в ASC|DESC никакой нет, как только появляються условия, разница больше чем в 100 раз выходит между ACS и DESC
 

440hz

php.ru
убери val и проверь?
в общем есть поле для мыслительного процесса...
 

Кощей

if(!$needle) die("ooh");
Нужно подумать, изза одной страниці где идентификатор слово немогу сдеалить интом

-~{}~ 06.04.08 21:01:

Мда, без val 0.0012 сек

-~{}~ 06.04.08 21:04:

Будуем избавляться от varchara :)
Всем спасибо за консультацию!
 

berkut

Новичок
а просвятите пожалуйста, почему варчар и деск - это одно, а варчар и аск - это другое? совсем не понимаю
 

440hz

php.ru
Автор оригинала: berkut
а просвятите пожалуйста, почему варчар и деск - это одно, а варчар и аск - это другое? совсем не понимаю
можно пофантазировать и сказать, что при выборке по val, т.к. оно varchar данные сбрасываются в таблицу на диске. далее идет сортировка (мож строятся временные ключи) и вот тут возможны варианты. мож mysql умный и при ASC и LIMIT делает выборку только до LIMIT, а при DESC выбирает все и потом уже с конца отсчитывает.

=)

вообще надо погонять запросы и посмотреть на статистку. можэт временное явление?

=)
 

Wicked

Новичок
а где хоть один эксплэин, а? будет так продолжаться - унесу тему в корзину :)
 

nail

Новичок
Ага. Тут explain нужен и show status like 'Handler%'.
Mysql любит дурить и выбирать не тот индекс.
 
Сверху