Как создать страницу данных для таблицы с ключом GUID

У меня есть таблица, похожая на ниже, которая имеет GUID в качестве ключа.Я пытаюсь отобразить содержимое TIS с помощью пейджинга, который имеет GUID в качестве ключа, но столкнулся с вопросом, как мне это сделать?

CREATE TABLE `planetgeni`.`PostComment` (
  `PostCommentId` CHAR(36) DEFAULT NULL,
  `UserId` INT   NOT NULL,
  `CreatedAt` DATETIME NULL DEFAULT NULL ,
  .
  .
  .
   PRIMARY KEY (`PostCommentId`)
    )
 ENGINE=InnoDB DEFAULT CHARSET=latin1;

если бы это был Int-ключ, моя хранимая процедура выглядела бы примерно так, давая мне следующие 10 заказов по desc. Но с GUID не уверен, как сделать этот тип подкачки.

getPostComment( int lastPostID)
   where PostCommentId< lastPostID order by PostCommentId desc LIMIT 10;

2 ответа

Измените столбец, которым вы пользуетесь, в 'order by'.

getPostComment( int lastPostID)
    where PostCommentId< lastPostID order by CreatedAt,UserId desc LIMIT 10;

Вы все еще можете сделать это с GUID, но поскольку GUID псевдослучайны, когда вы ORDER BY postcommentid заказ, вероятно, не будет тем, что вы хотите. Вы, вероятно, хотите что-то в приблизительно хронологическом порядке, и когда вы сортируете по случайному GUID, порядок будет повторяемым, но случайным.

Как комментарии @James, вы можете использовать другой столбец для порядка сортировки, но этот столбец должен быть уникальным, иначе вы либо пропустите некоторые дублирующиеся строки (если вы используете >) или повторите значения на следующей странице (если вы используете >=).

Вам просто нужно использовать LIMIT с OFFSET, MySQL оптимизирует запросы LIMIT, поэтому он прекращает проверку строк, как только находит строки, необходимые для страницы. Но он также должен проверять все предыдущие строки, поэтому запрос становится более дорогим по мере продвижения по страницам с большим номером.

Несколько способов смягчить это:

  • Не позволяйте пользователям просматривать страницы с большими номерами. Определенно, не давайте им прямую ссылку на "последнюю" страницу. Просто дайте им ссылку на страницу "Далее" и надейтесь, что они прекратят поиск, прежде чем продвинутся так далеко, что запросы станут очень дорогостоящими.

  • Получать более одной страницы за раз и кэшировать ее. Например, вместо LIMIT 10, вы могли бы LIMIT 70 а затем сохранить результаты в memcached или что-то. Используйте код приложения для представления 10 строк за один раз, пока пользователь не пройдет через этот набор строк. Тогда только если они перейдут на 8-ю страницу, запустите еще один SQL-запрос. Пользователи обычно не выполняют поиск более чем на нескольких страницах, поэтому вероятность выполнения второго или третьего запроса становится очень маленькой.

Другие вопросы по тегам