Что вам нужно, это 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.