Protossan
@Protossan
студент

Как можно оптимизировать запрос на главной странице?

Сайт с двумя миллионами записей, и запрос

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
WHERE 1=1
AND ( wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (34,171) ) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 40


, который выполняет обычный цикл на главной
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>


выполняется почти 8 секунд
5d760892dc6fa762936072.png
Насколько я понимаю, все дело в SQL_CALC_FOUND_ROWS? Как его можно убрать? Или для постраничной этот параметр обязателен? Может его можно вынести в простой запрос
SELECT COUNT(*) FROM wp_posts
WHERE 1=1
AND ( wp_posts.ID NOT IN (
SELECT object_id
FROM wp_term_relationships
WHERE term_taxonomy_id IN (34,171) ) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')

?
  • Вопрос задан
  • 204 просмотра
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
насколько я понимаю, все дело в SQL_CALC_FOUND_ROWS?

вряд ли. но все равно сносите.

The SQL_CALC_FOUND_ROWS query modifier and accompanying FOUND_ROWS() function are deprecated as of MySQL 8.0.17 and will be removed in a future MySQL version.

похоже в данном конкретном запросе для расчета группировки и сортировки движку все равно придется фетчить все записи. покажите план запроса плз
EXPLAIN SELECT ...

update. уберите группировку по первичному ключу (ID ведь первичный ключ?), ибо записи по нему и так уникальны. добавьте индекс post_date DESC.

P.S. где этот запрос генерируется движком не подскажу, всегда старательно избегал с ним связываться))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы