Будет ли этот тип шкалы нумерации страниц? - PullRequest
1 голос
/ 19 сентября 2011

Мне нужно разбить на несколько моделей, которые могут / станут большими. Результаты должны быть отсортированы таким образом, чтобы последние записи отображались на первой странице (а затем мы можем перейти к началу, используя ссылки «Далее»).

Запрос на получение первой страницы следующий, 4 - количество записей, которые мне нужны на странице:

 SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_id = 1) ORDER BY created_at DESC LIMIT 4 OFFSET 0;

Поскольку это нужно отсортировать, а количество записей может увеличиться, столкнусь ли я с серьезными проблемами с производительностью?

Какие есть варианты, чтобы сделать это быстрее?

Насколько я понимаю, индекс 'follow_id' просто поможет предложению where. Мое беспокойство по поводу «заказа по»

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

вы можете проиндексировать эти поля.но это зависит: вы можете предположить (в основном), что create_at уже упорядочен.Так что это может быть ненужным.Но это больше зависит от вашего приложения.

в любом случае вам следует индексировать follow_id (если это не первичный ключ)

1 голос
/ 19 сентября 2011

Создайте индекс, который содержит эти два поля в следующем порядке (followed_id, created_at)

Теперь, насколько велик большой, о котором мы здесь говорим? Если это будет порядка миллионов .. Как насчет чего-то вроде следующего ...

Создание индекса по ключам followed_id, created_at, id (Это может измениться в зависимости от полей в select, where и order by. Я сделал это специально для вашего вопроса)

SELECT relationships.* 
FROM relationships 
JOIN (SELECT id 
      FROM relationships
      WHERE followed_id = 1 
      ORDER BY created_at 
      LIMIT 10 OFFSET 10) itable 
ON relationships.id = itable.id 
ORDER BY relationships.created_at

Объяснение даст это:

+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
| id | select_type | table         | type | possible_keys | key         | key_len | ref  | rows | Extra                                               |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
|  1 | PRIMARY     | NULL          | NULL | NULL          | NULL        | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
|  2 | DERIVED     | relationships | ref  | sample_rel2   | sample_rel2 | 5       |      |    1 | Using where; Using index                            |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+

Если вы внимательно изучите, подзапрос, содержащий предложения порядка, лимита и смещения, будет работать с индексом напрямую, а не с таблицей, и, наконец, объединится с таблицей, чтобы получить 10 записей.

Это имеет значение, когда в какой-то момент ваш запрос делает вызов, такой как limit 10 offset 10000. Он извлечет все 10000 записей из таблицы и извлечет первые 10. Этот трюк должен ограничить обход только индексом.

Важное примечание: Я проверял это в MySQL. Другая база данных может иметь незначительные различия в поведении, но концепция остается верной, несмотря ни на что.

...