Помогите ускорить запрос к MySQL с большим offset limit

394
23 мая 2017, 01:55

Подскажите, пожалуйста, как лучше составить запрос к mysql для вывода новостей на DLE, чтобы максимально ускорить? по дефолту представлен следующий запрос:

SELECT p.id, p.autor, p.date, p.short_story, 
   CHAR_LENGTH(p.full_story) as full_story, 
   p.xfields, p.title, p.category, p.alt_name,
   p.comm_num, p.allow_comm, p.fixed, p.tags, 
   e.news_read, e.allow_rate, e.rating, e.vote_num, 
   e.votes, e.view_edit, e.editdate, e.editor, e.reason 
FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) 
WHERE approve=1 AND allow_main=1 AND date < '2017-05-18 14:23:53' 
ORDER BY date DESC LIMIT 182208,48 

С помощью него mysql отдает ответ за 3.1171 сек. Я чуть чуть подкорректировал его и привел к такому виду:

SELECT p.id, p.autor, p.date, p.short_story, 
    CHAR_LENGTH(p.full_story) as full_story, 
    p.xfields, p.title, p.category, p.alt_name, 
    p.comm_num, p.allow_comm, p.fixed, p.tags, 
    e.news_read, e.allow_rate, e.rating, e.vote_num, 
    e.votes, e.view_edit, e.editdate, e.editor, e.reason 
FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) 
    JOIN ( SELECT id 
           FROM dle_post 
           WHERE approve=1 AND allow_main=1 
              AND date < '2017-05-18 14:23:53' 
           ORDER BY date DESC LIMIT 182208,48 
         ) as t ON t.id = p.id

Данный запрос отрабатывает за 1.3736 сек.

Подскажите пожалуйста, возможно ли еще как-то ускорить получение ответа?

Answer 1

Добавьте в сортировку поле dle_post.id и передавайте в запрос dle_post.id и dle_post.date из последней строки предыдущей выборки. Будет такой запрос:

SELECT p.id, p.autor, p.date, p.short_story, 
   CHAR_LENGTH(p.full_story) as full_story, 
   p.xfields, p.title, p.category, p.alt_name,
   p.comm_num, p.allow_comm, p.fixed, p.tags, 
   e.news_read, e.allow_rate, e.rating, e.vote_num, 
   e.votes, e.view_edit, e.editdate, e.editor, e.reason 
FROM dle_post p
LEFT JOIN dle_post_extras e ON (p.id=e.news_id) 
WHERE approve=1
      AND allow_main=1
      AND (p.date < @last_date
           OR
           (p.date = @last_date
            AND p.id = @last_id))
ORDER BY date DESC, id DESC
LIMIT 48;
READ ALSO
Как найти связанные таблицы MySQL?

Как найти связанные таблицы MySQL?

Как найти связанные таблицы MySQL? Те

411
Автоматическая установка mySQL 5.7.18 type and networking нет кнопки

Автоматическая установка mySQL 5.7.18 type and networking нет кнопки

Привет! Доходит до этого этапа установки, а кнопки, чтобы продолжить нет!

470
Запись данных в БД MySQL по горизонтали

Запись данных в БД MySQL по горизонтали

По умолчанию записи идут по вертикали сверху вниз, как изменить их расположение(чтобы они шли в одну строчку)? Пока что они так расположены:

332
Как при выходе из приложения очищать кеш приложения?

Как при выходе из приложения очищать кеш приложения?

Есть приложение, которое обращается к файлу json, который лежит на хостинге, чтоб получить список радиостанцийЕсли я добавлю в файл json какую...

410