SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 16.04.2009 21:58:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Двойная сортировка и filesort =(

Запрос и структуру таблички — в студию smile

Неактивен

 

#27 16.04.2009 22:10:58

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Двойная сортировка и filesort =(

Запрос:

SELECT STRAIGHT_JOIN t1. *
FROM topic t2
FORCE INDEX ( sorting )
JOIN topic t1
FORCE INDEX (
PRIMARY )
USING ( id )
WHERE (
t1.private =0
OR (
t1.fid
IN ( 5, 7 )
AND t1.private =1
)
)
ORDER BY t2.notpinned, t2.last_post_time DESC
LIMIT 0 , 25


Структура таблицы в сообщении #23 !!!

Отредактированно Proger (16.04.2009 22:25:28)

Неактивен

 

#28 17.04.2009 00:13:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Двойная сортировка и filesort =(

Если такая же, как в сообщении 23, то ничего удивительного, что filesort:
у Вас нет индекса по тем полям, которые Вы просите в сортировке.

Неактивен

 

#29 17.04.2009 00:58:53

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Двойная сортировка и filesort =(

Блин... безмысленный постинг сейчас идет, естественно я добавил поле в индекс, вот текущая таблица кароче:

CREATE TABLE `topic` (
  `gid` int(8) NOT NULL,
  `id` int(8) NOT NULL auto_increment,
  `fid` int(8) NOT NULL,
  `aid` int(8) NOT NULL,
  `aname` varchar(50) NOT NULL,
  `name` varchar(200) NOT NULL,
  `text` text NOT NULL,
  `date` datetime NOT NULL,
  `editdate` datetime NOT NULL,
  `last_post_time` datetime NOT NULL,
  `last_poster_id` int(8) NOT NULL,
  `last_poster_name` varchar(25) NOT NULL,
  `last_post_id` int(8) NOT NULL,
  `posts` int(8) NOT NULL,
  `views` int(8) NOT NULL,
  `notpinned` tinyint(1) NOT NULL,
  `closed` tinyint(1) NOT NULL,
  `erased` tinyint(1) NOT NULL,
  `private` tinyint(1) NOT NULL,
  `first_post_pinned` tinyint(1) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `sorting` (`notpinned`,`last_post_time`)
) ENGINE=InnoDB  DEFAULT CHARSET=cp1251


Просто, когда я набирал сообщение #27 у меня лаганула клава после вставки запроса, пришлось перезагружатся, а потом я и забыл добавить структуру, и написал что такая же как в #23...

Неактивен

 

#30 17.04.2009 11:35:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Двойная сортировка и filesort =(

Оо, я проглядел. У Вас зверек «pinned» стал вдруг «notpinned». Из-за этого Вам опять нужно
сортировать в разном порядке. У меня со «старой структурой» получается вот так:

Код:

[celestia] root test > EXPLAIN SELECT STRAIGHT_JOIN t1. * FROM topic t2 FORCE INDEX ( pinned ) JOIN topic t1 FORCE INDEX ( PRIMARY ) USING ( id ) WHERE ( t1.fid IN ( 5, 7 )  ) ORDER BY t2.pinned DESC, t2.last_post_time DESC LIMIT 0 , 25;
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
| id | select_type | table | type   | possible_keys | key     | key_len | ref        | rows | Extra       |
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
|  1 | SIMPLE      | t2    | index  | NULL          | pinned  | 9       | NULL       |    5 | Using index | 
|  1 | SIMPLE      | t1    | eq_ref | PRIMARY       | PRIMARY | 4       | test.t2.id |    1 | Using where | 
+----+-------------+-------+--------+---------------+---------+---------+------------+------+-------------+
2 rows in set (0.00 sec)

Сортировка в одну сторону, поэтому использует индекс. WHERE не использует индекс, ну и фиг с ним wink

UPD: А, да, не написал:
  KEY `pinned` (`pinned`,`last_post_time`)

Неактивен

 

#31 17.04.2009 15:39:13

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Двойная сортировка и filesort =(

ээм... как раз таки с полем pinned где 1 это да 0 нет, у меня получилось что тоже нужно делать две сортировки, потому сменил на notpinned и сортировка как вы видите в представленном запросе идет в одну сторону.

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

Отредактированно Proger (17.04.2009 15:41:23)

Неактивен

 

#32 17.04.2009 17:09:17

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Двойная сортировка и filesort =(

Ну, если у Вас два сложных запроса в разные стороны, возможно, прийдется пойти на денормализацию
данных и хранить оба значения (ну и, разумеется, следить за консистентностью как-то еще).

Неактивен

 

#33 17.04.2009 17:40:20

Proger
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 04.09.2008
Сообщений: 172

Re: Двойная сортировка и filesort =(

Запросов у меня всего к этой таблице (ну естесвенно подобного рода только) 2. Один выводит темы конкретного форума, где можно листать по бескочесности, а второй выводит ленту форума. И в обоих случаях используется только такая сортировка (в одну сторону DESC BY pinned, last_post_time) потому я несколько вас не понимаю про денормализацию. Попробую ещё поэспериментировать, но что-то я запутался немного.

Неактивен

 

#34 17.04.2009 18:50:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Двойная сортировка и filesort =(

Если всегда прилепленные должны быть сверху и сортировка по дате всегда в обратном порядке,
то Вам нужен только pinned и сортировка, соответственно, pinned DESC, last_post_time DESC.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson