Wordpress медленный запрос на wp_posts - PullRequest
0 голосов
/ 24 февраля 2019

У нас есть WordPress с базой данных с 2 миллионами записей в wp_posts, новая реликвия показывает, что у нас есть несколько медленных запросов, но этот принимает

 SELECT wp_posts.ID 
 FROM wp_posts  
 WHERE ?=?  AND wp_posts.post_type = ? AND ((wp_posts.post_status = ?))  ORDER BY wp_posts.post_title ASC 
 LIMIT ?, ? 

И это объясняет это:

enter image description here

Я не знаю точно, как я могу оптимизировать этот запрос, но думаю, мне нужно добавить индекс с (id, post_type, post_status и post_title)?

1 Ответ

0 голосов
/ 06 марта 2019

Что вам нужно, это INDEX(type, status, title, ID).Но это не сработает, потому что вы не можете иметь столбец TEXT (как в post_title) в индексе.

Так что нет оптимизации и нет полезного индекса.

WP - этоне рассчитан на масштабирование.2M строк - это много, хотя и не так плохо, как если бы вы присоединялись к postmeta или другим таблицам.

Этот запрос должен собрать все заголовки определенного типа и статуса, отсортировать их,пропустите OFFSET и, наконец, предоставьте несколько идентификаторов.

Если вы используете OFFSET из-за «нумерации страниц», то у вас есть вторая проблема - запрос будет медленнее и медленнее, чем пользовательстраницы в списке.(Обратите внимание на шаг «пропустить», который я упомянул.)

Если вы можете ограничить заголовки до 255 (или, возможно, 191, в зависимости от версии и кодировки) символов, тогда INDEX IУпомянутое будет работать, и это будет работать намного быстрее.Это потребовало бы и ALTER TABLE для изменения post_title на VARCHAR(...), что заняло бы некоторое время и потеряло бы данные, если какие-либо заголовки были бы усечены.

Возможное решение ... Поскольку нецелесообразно предоставлять 2Mстроки для пользователя, можем ли мы угадать, что type и / или status довольно избирательно?То есть действительно ли существует всего несколько сотен интересующих строк?В этом случае это может помочь:

INDEX(post_type, post_status) -- in either order.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...