Добавить индекс для поля в БД
Здравствуйте, использую поиск по произвольным полям. Вот это решение
Как выяснилось нагрузка на БД очень существенная, установил Query Monitor и обнаружил, что запрос sql отрабатывает более 1 секунды.
Рекомендуют добавить в таблицу wp_postmeta индекс для поля meta_key
Но как это сделать не знаю. Кто в этом разбирается просьба подсказать решение.
Сделал запрос SHOW INDEX FROM wp_postmeta;
Какой-то индекс там уже есть, но походу не то что нужно.
Да индекс на этом поле есть уже и это то что нужно. Тут проблема с полем meta_value, правда на него индекс вешать смысла особо нет.
Может вам как-то кэшировать результат запроса?
Я уже писал по этому вопросу тебе. Результаты теста показали что лучше всего работает именно этот код, если добавить индекс. Была проблемка с поиском по целевой фразе, но это удалось решить самостоятельно. А вот отключить поиск по контенту не получается.
add_filter( 'posts_clauses', 'km_metadata_search' ); # Добавляем поиск по метаполям в базовый поиск WordPress function km_metadata_search( $clauses ){ global $wpdb; if( ! is_search() || ! is_main_query() ) return $clauses; $clauses['join'] .= " LEFT JOIN $wpdb->postmeta kmpm ON (ID = kmpm.post_id)"; $clauses['where'] = preg_replace( "/OR +\( *$wpdb->posts.post_content +LIKE +('[^']+')/", "OR (kmpm.meta_value LIKE $1) $0", $clauses['where'] ); // если нужно искать в указанном метаполе $clauses['where'] .= $wpdb->prepare(' AND kmpm.meta_key = %s', 'my_meta_key' ); $clauses['distinct'] = 'DISTINCT'; // дебаг итогового запроса 0 && add_filter( 'posts_request', function( $sql ){ die( $sql ); } ); return $clauses; }