3.6 in April added wc_product_meta_lookup, a flat table of the attributes catalogue queries filter on — which is WooCommerce accepting that postmeta does not scale.
DESCRIBE wc_product_meta_lookup;
-- product_id, sku, virtual, downloadable, min_price, max_price,
-- onsale, stock_quantity, stock_status, rating_count, average_rating,
-- total_sales
-- what it replaces: a JOIN on wp_postmeta per filter
SELECT p.ID FROM wp_posts p
JOIN wc_product_meta_lookup l ON l.product_id = p.ID
WHERE l.stock_status = 'instock' AND l.min_price BETWEEN 10 AND 50;
The table is populated by a background job on upgrade, and on a large catalogue that takes hours — during which queries return partial results and nobody has been told. wp wc tool run regenerate_product_lookup_tables is the manual trigger and it is worth running deliberately in a window rather than letting the scheduler do it. Anything not in those columns still lives in postmeta, so a shop filtering on a custom attribute gains nothing.