Имя: Пароль:
LIFE
Жизнь форума
OFF: Новая навигация по списку веток
0 Волшебник
 
модератор
30.01.07
18:11
При разработке нового движка форума обнажилась следующая проблема. При "страничной парадигме", когда под списком тем выводятся номера страниц "1   2   3   4 ... 10  >>" возникают тормоза с выводом больших (глубоких) страниц. Например, если запросить страницу №40, то в запросе будет что-то типа LIMIT 800,20 и MySQL вынужден просматривать все предыдущие 800 веток, чтобы показать эту страницу с учётом фильтра из ваших личных настроек (отключенные разделы/секции). Скорость просмотра - примерно 500 веток в секунду. Для небольших номеров страниц работает быстро, для больших - всё медленнее и медленнее. Поэтому сейчас на мисте запрещены запросы с номером страницы > 50. Это слишком перегружает сервер. Кстати, такой же проблемой страдает и RSDN.ru. На Т1С проблема не стоит так остро, потому что список актульных веток умещается на 40-50 страницах, а архив умещается на 300 страницах.

Формулирую задачу. Требуется ускорить показ списка тем при любой глубине запроса. Значительного ускорения можно добиться, если в запросе добавить условие на дату, которое отсечёт ту часть базы, которую не надо просматривать. В этом случае индекс по полю updated будет задействован эффективно (не только для сортировки, но и для отбора), а LIMIT будет содержать маленькие значения, например, LIMIT 0,20.

Вижу единственный метод решения: отказаться от "страничной парадигмы" и привязаться ко времени (даты или периоды). Номер страницы в принципе не несёт никакой полезной информации, а вместо него выводить даты или период.

Я предлагаю сделать так:
Вместо номеров страниц показывать следующее:
<<  интервал  >>

где "интервал" показывает границы интервала: даты первой и последней ветки в выборке.

Конкретные примеры:

Главная страница:
<< 16:40 - 16:59

При щелчке на ссылке "<<" (влево по оси времени, т.е. в прошлое) показываем предыдущие 20 веток (или то число, которое указано в личных настройках) и видим:
<< 16:09 - 16:39  >>

Теперь доходим до страницы, где есть ветки из двух дат (допустим в полночь):
<< 29 янв 23:50 - 30 янв 05:60 >>

А теперь делаем отбор по секции, и там есть ветки за несколько дней (больше 2), но в рамках одного месяца. В этом случае время уже несущественно и его не показываем:
<< 1 - 5 янв >>

Если секция обновляется нечасто и на одной странице есть ветки за 2 месяца, то видим название месяца у обоих границ интервала:
<< 30 янв - 3 фев >>

Если же год не является текущим или в выборке попались ветки за 2 месяца, но из разных лет (например, в Новый год), то в интервале ещё указывается и год:
<<  31 дек 2006 - 1 янв 2007 >>

А теперь делаем отбор по очень редко обновляемой секции, где на одной странице есть ветки за несколько месяцев (больше 2), в этом случае дни уже несущественны и показываем только месяцы:
<<  окт - дек  >>

или с учетом года, если находимся на границе лет:
<<  ноя 2006 - янв 2007 >>

или в рамках одного года, но год меньше текущего:
<<  окт 2006 - дек 2006 >>

и т.д.

Преимущества такой навигации следующие:
1. Простота и интуитивная понятность интерфейса, минимум ссылок (шаг в прошлое и шаг в будущее) и минимум личных настроек (кол-во веток на страницу).
2. Всегда понятно, где ты находишься на оси времени. Причём, чем больше плотность веток, тем детальнее показывается интервал (от минут, до месяцев и лет).
3. Можно пошагово углубиться в прошлое или вернуться в будущее. При этом размер шага в количестве веток всегда одинаковый, но расстояние во времени, которое мы "проходим" за этот шаг - разное, в зависимости от реальной плотности веток (интенсивности обновления).
4. Размер страницы (количество веток на странице) не меняется и в точности равен тому, что указан в личных настройках или 20 веток на страницу по умолчанию.
5. Страницы показываются быстро вне зависимости от глубины запроса во времени, плотности веток и личных настроек. Это достигается за счёт того, что в гиперссылки "<<" и ">>" добавляется метка времени, с которой начинается выборка из базы данных.

Недостатки:
1. Нельзя переместиться сразу на несколько шагов во времени.
2. Невозможно предсказать, какой период будет показан при следующем шаге
3. У некоторых специалистов по юзабилити (Camino) есть сомнения в том, что информация о текущем периоде является полезной. Но здесь лично я не согласен, поскольку основа любой навигации - это ответ на вопрос "Где я сейчас?"

Что скажете?
1 Скользящий
 
30.01.07
18:14
Нормально.  Будет как в 1с период журнала. Только, прошу, не надо форум полностью похожим на конфигуратор делать. :-) И так задалбывает.
2 Андрюха
 
30.01.07
18:15
Не привычно, по этому
3 Каанкереде
 
30.01.07
18:20
Смущает только п.1  и п.2

Тогда уж действительно, нужно как в 1с, выбирать нужный период...
4 Груздь
 
30.01.07
18:24
6 Jolly Roger
 
30.01.07
18:26
Поддержу Camino. Сколько веток слева осталось - неизвестно.
7 Волшебник
 
модератор
30.01.07
18:27
(6) В общем случае слева (прошлое) осталось бесконечное количество веток (или очень много).
8 romix
 
модератор
30.01.07
19:32
Я за!!!
Дата - индексированное поле,
и к тому же в поисковиках не будет уползать найденное!
9 romix
 
модератор
30.01.07
19:35
Можно по неделям список резать, или по дням.
10 КонецЦикла
 
30.01.07
19:42
Нравится, только не совсем просек, хорошо бы сбоку сделать дату создания/последнего обновления
11 be-may
 
30.01.07
19:46
Поюзаем - посмотрим. Пока -> 1.
Тем более, если это "единственный метод решения" :)
12 АСанСаныч
 
30.01.07
20:02
Ну, если "3. Можно пошагово ... вернуться в будущее", то
13 Zaval
 
30.01.07
21:14
Дорогу осилит идущий...
14 bazvan
 
30.01.07
21:18
А можно как то сделать если я перехажу на 5 странитЦу и просматриваю там какую то ветку то при нажатии "Список тем форума" оставатся на 5 странитЦе а не вываливатся на первую?
15 Kalambur
 
30.01.07
21:24
если честно
16 Neco
 
30.01.07
21:32
Если это ускорит работу форума, тогда за
17 AeDen
 
30.01.07
21:40
В принципе, за.
Тока один вопрос. Как будут выбираться интервалы???

Кстати, на самом деле, нельзя ссылку в "найти мои темы" сменить с "find" на "index.php?user_id="?
18 Стерва-бух
 
30.01.07
22:17
Очень не нравится 1-й пункт в недостатках.
19 romix
 
30.01.07
23:26
А можно все проще:
группировать вчерашние и более старые ветки по 100 согласно номеров.
21 Волшебник
 
модератор
31.01.07
11:37
(14) Нажимай "Назад" в браузере.

(17) Уже давно сменил же.

(19) Так не получится, потому что список веток перемешивается за счет всплытия веток.
22 Advan
 
31.01.07
12:19
не все понял - ИМХо будет удобней чтобы первые 40 страниц отображались как обычно, а остальные можно и по периоду - всеравно их через поиск находят.
23 aka Любитель XML
 
31.01.07
12:40
Нравится
24 LobS
 
31.01.07
12:57
Думаю можно избавиться от первого недостатка. Задавать интервал перемещения во времени (можно в настройках, например 30 минут, или в настройках и поле на странице - если не указано, то как в настройках), делать выборку за период, а дальше выборку дробить на номера страниц по 20 (из настроек) на каждом номере.
25 Preda1or
 
31.01.07
13:03
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn