A variable product with four sizes and three colours is not one row. Every combination is a product_variation post carrying its own meta, so a catalogue that reads as two thousand products in the admin is closer to twenty thousand rows in wp_posts and six figures in wp_postmeta.
SELECT post_type, COUNT(*) FROM wp_posts GROUP BY post_type;
-- product 2140
-- product_variation 18627
SELECT COUNT(*) FROM wp_postmeta pm
JOIN wp_posts p ON p.ID = pm.post_id
WHERE p.post_type = 'product_variation';
-- 223524
Twelve meta rows per variation is ordinary: _price, _regular_price, _sku, _stock and one row for each attribute. wp_postmeta is indexed on post_id and on meta_key and never on meta_value, so a report filtering by price or stock level scans, and a meta_query across two attributes joins the table twice to do it. Two consequences worth planning for: a query that does not pin post_type silently pulls variations into both its results and its counts, and a product genuinely needing several hundred combinations is usually several products sharing a template. The structure is not a mistake — it is what lets a variation hold its own stock and price — but it is worth understanding before quoting a number for the import.