2014-09-12 2 views
0

Например, моя таблица имеет эти данные:Хорошая производительность пагинации для MySQL

id(auto increment)  :place  :views 
1      :test1  :20 
2      :test2  :50 
3      :test3  :30 

Я думаю о системе постраничной.

Когда я сортирую виды, я использую этот sql.

select * from table order by views desc; 

Вот результат:

id :place :views 
2  :test2 :50 
3  :test3 :30 
1  :test1 :20 

Я хотел бы использовать эти данные для пагинации.

Page 1: 
select * from table order by views desc limit 0, 2; 
Page 2: 
select * from table order by views desc limit 2, 2; 

Однако, если эта таблица имеет много данных, производительность БД является ленивой.

Я нашел хороший слайд для решения этой проблемы. http://www.slideshare.net/Eweaver/efficient-pagination-using-mysql

Но, у моих данных нет сортируемого идентификатора.

Я ищу любую полезную идею.

+0

Какие данные представляют собой столбец представлений? – Dale

ответ

1

Для реализации сверхвысоком "следующая страница" функциональность, если id является уникальным в MyTable:

CREATE INDEX mytable_IX1 ON mytable (views, id); 

для первой страницы:

SELECT id, place, views 
    FROM mytable 
ORDER BY views DESC, id DESC 
LIMIT 2 

Извлечение строки. Если вы получили полные две строки, может быть больше строк, поэтому сохраняйте значения views и id из этой «последней» строки для использования в запросе «следующая страница».

Для следующей страницы, используйте значение views и id, которые были сохранены от «последней строки» с предыдущей страницы:

SELECT id, place, views 
    FROM mytable 
WHERE views <= :pp_views AND (id < :pp_id OR views < :pp_views) 
ORDER BY views DESC, id DESC 
LIMIT 2 

Если вы получаете полные две строк, то вы можете получить " следующая страница», просто снова использовать views и id значения от„последней строки“предыдущей страницы, запрос точно так же:

SELECT id, place, views 
    FROM mytable 
WHERE views <= :pp_views AND (id < :pp_id OR views < :pp_views) 
ORDER BY views DESC, id DESC 
LIMIT 2 

не ясно, почему этот подход не работает для вас. У вас нет уникального столбца таблицы, которую вы можете использовать? (Ваш вопрос предполагает, что у вас есть уникальная колонка (авто_инкремент) id.)

+0

Отлично! Я многому научился здесь. WHERE views <=: pp_views AND (id <: pp_id ИЛИ views <: pp_views) ЗАКАЗАТЬ ПРОСМОТРЕТЬ DESC, id DESC Спасибо большое! – Osushi

+1

Еще одно небольшое усовершенствование для вас: определение того, есть ли еще одна строка за последней, которая будет отображаться.Точно такой же SQL, но 'LIMIT 3' (на один больше размера страницы). Используйте первые две строки, возвращенные для diaplay, сохраните значения «views» и «id» из второй строки (последняя строка будет отображаться на странице). Если 3-я строка не возвращается, вы знаете, что больше нет строк, поэтому не позволяйте пользователям отправлять запрос «следующей страницы». (Вы можете указать пользователю, что больше страниц не будет отображаться.) – spencer7593

+0

Я понял. Большое спасибо! – Osushi

0

в вашем случае я бы взгляды индекса и далее будет ссылка на последний показано идентификатор в вашем примере следующий будет &index=3

то запрос будет получение мнения ID 3 имеет, а затем искать меньше, чем с предел.

Смежные вопросы