Добавить индекс для поля в БД

Здравствуйте, использую поиск по произвольным полям. Вот это решение
Как выяснилось нагрузка на БД очень существенная, установил Query Monitor и обнаружил, что запрос sql отрабатывает более 1 секунды.

Рекомендуют добавить в таблицу wp_postmeta индекс для поля meta_key
Но как это сделать не знаю. Кто в этом разбирается просьба подсказать решение.

Сделал запрос SHOW INDEX FROM wp_postmeta;
Какой-то индекс там уже есть, но походу не то что нужно.

Заметки к вопросу:
lethalblo 2.2 года назад

Kama 2.1 год назад

Да индекс на этом поле есть уже и это то что нужно. Тут проблема с полем meta_value, правда на него индекс вешать смысла особо нет.

Может вам как-то кэшировать результат запроса?

lethalblo 2.1 год назад

Я уже писал по этому вопросу тебе. Результаты теста показали что лучше всего работает именно этот код, если добавить индекс. Была проблемка с поиском по целевой фразе, но это удалось решить самостоятельно. А вот отключить поиск по контенту не получается.

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;
}