Optimizing WP_Query

Disable the found_posts calculation

If pagination is not required, use the no_found_rows parameter to disable the SQL_CALC_FOUND_ROWS query that checks for the total number of posts:

'no_found_rows' => true,

Query for a single post_type

To prevent an extra JOIN, set the post_type parameter explicitly:

'post_type' => 'post',

Disable the posts_groupby filter

The posts_groupby filter adds the ability to run GROUP BY on the returned array of posts. In most cases, this is not necessary. To disable, pass WordPress’ __return_false() function to the add filter:

add_filter( 'posts_groupby', '__return_false' );

And to reset after your query:

remove_filter( 'posts_groupby', '__return_false' );

Use tax_query over meta_query when searching for posts

Unlike taxonomies, postmeta values do not have indexes. meta_query searches through the entire wp_postmeta table which results in slow queries.