Build1 distinct publisher3 min readUpdated
Prices in Magento 2 are computed from tier prices, catalog rules, groups and staging, not read from a column. That is why the price indexer scales worst, and why hand-written SQL fixes backfire.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
A walkthrough published on dev.to argues that when a client asks why their Magento 2 reindex is slow, the answer is almost always the price index: it is the indexer that scales worst with catalog size, and it chokes hardest on B2B stores and configurable-heavy catalogs [1]. The same piece makes the point that matters operationally, which is that the index gets more painful the more you try to fix it with raw SQL [2].
The reason is structural. The raw price you type into the admin lands in `catalog_product_entity_decimal`, one row per product, attribute, store and scope [3]. But the effective price stops being a column lookup the moment you add tier prices, scheduled special prices, catalog price rules, customer group prices, bundle or grouped composite pricing, configurable products with per-option adjustments, or Content Staging updates [4]. Because the answer depends on time, customer group and rule conditions, Magento has to precompute it [5]. When the precomputation is current, a page request reads flat, pre-joined rows; when it is stale or under-built, you either serve wrong prices or trigger expensive on-the-fly calculation [6].
The build itself writes to `catalog_product_index_price`, plus `_idx` and `_tmp` variants and the `catalog_product_index_price_final_tmp` intermediate table [7]. It runs in phases: load every product into the temp table at base price, apply tax, tier, special, group and rule adjustments, resolve composite products (bundle min/max, grouped sums), then merge into the final table with its customer group, website and store dimension rows [8].
That dimension space is where the cost lives. One row per product times website times customer group means a 50,000 SKU store on two websites with four customer groups produces 400,000 price index rows [9][10], or eight rows per SKU before anything else [1]. Configurable option permutations and staged versions multiply it further [11], and a configurable product with 50 options effectively fans out into 50 price rows minus on-demand fallbacks [12].
The rule engine is the other half. Unlike tier prices, which are stored per row, catalog price rules are evaluated by an engine that tests each product against each rule's conditions, which is a full-catalog rules evaluation rather than a read [13]. The MySQL-based `catalogrule` engine is slow and the indexer runs it on every reindex [14]; according to the guide this is the single most common reason a price reindex takes minutes to hours on real stores [15].
Partial reindexing does not save you either. A full `indexer:reindex catalog_product_price` rebuilds the entire dimension space [16], and the price indexer historically had weak partial support, so one product save could kick off a large portion of the rebuild [17]. Mview helps, but on write-heavy stores it falls behind, and once it falls too far behind Magento drops into a synchronous rebuild mid-request [18]. Underneath all of it, the indexer builds large temporary tables, sorts them and merges them, which is brutal on an under-provisioned MySQL with a small `innodb_buffer_pool_size` and no SSD [19], and it cannot easily be parallelised by default [20].
The diagnostic order the piece recommends is worth copying: check the schedule status for `catalog_product_price`, time a full build, then count rows in `catalog_product_index_price` and `catalog_product_index_price_final_tmp` [21]. If the row count sits at five to ten times your SKU count, the problem is multiplication across websites, groups and option permutations, and no amount of server tuning will fix it [22].
Worth watching on your own stores: the ratio of index rows to SKUs, and whether mview is quietly behind, because both determine whether the next slow page load is a cache miss or a full rebuild happening inside a customer's request.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The price index table balloons because it holds one row per product times website times customer group.
A 50,000 SKU store across 2 websites and 4 customer groups produces 400,000 price-index rows.
Configurable option permutations and staged versions multiply the price-index row count further.
Unlike the URL-rewrite indexer, the price indexer historically had weak partial-reindex support, so a single product save could kick off a large portion of the rebuild.
Mview, the changelog-based indexer, helps, but on heavy write stores it can still fall behind, and once it falls too far behind Magento falls back to a synchronous rebuild mid-request.
Prices do not live on the product table; on product save Magento stores the raw price on catalog_product_entity_decimal, one row per product, attribute, store and scope.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Verifiable internals, unmeasured performance claims
The structural half of the story is specific and checkable: named tables (catalog_product_entity_decimal, catalog_product_entity_tier_price, catalog_product_index_price, catalog_product_index_price_final_tmp), a named phase sequence, exact CLI/SQL commands, and worked row arithmetic that is internally consistent. The performance half - which indexer is worst, how often the rules engine dominates, the 'orders of magnitude' and 'minutes to hours' ranges, and the 5-10x ratio heuristic - carries no timings, profiles, store samples or citations, and the body is truncated before the optimisation list completes. One publisher, one author, no corroboration.
No adoption signal in supplied sources
The cluster contains no release, deployment, benchmark publication, pricing or licence change, or usage disclosure. Nothing in the supplied text reports how many stores follow this guidance, how widely the described refactors are applied, or any measured outcome, so no adoption level can be scored without inventing facts.
Mildly overstated relative to shown evidence
The mechanism claims are sober and mostly self-verifying, which keeps the gap small. The overstatement is concentrated in unquantified superlatives - the price index is 'almost always' the answer, the rules engine is 'the single most common reason', configurable catalogs are 'orders of magnitude' slower, raw SQL always backfires, and a 5-10x row ratio marks a multiplication problem - none of which are supported by measurement in the supplied material, while the article's own example already implies 8x rows per SKU for an unremarkable configuration. Nothing appears understated.
Agency expertise marketing on a developer platform
The post is published under an agency-style dev.to handle (magevanta) and opens from a consulting stance - 'Next time a client asks why is my reindex slow' - positioning the author as the specialist who diagnoses Magento performance for clients. That is a clear expertise-marketing incentive to frame the problem as deep, common and requiring guided intervention. Mitigating factors: the guidance is self-serve and vendor-neutral, no product, module or paid service is named or sold in the supplied text, and no sponsorship is disclosed or apparent.
Low-moderate: one voice, checkable mechanics
Confidence is limited by a single-publisher, single-author cluster with no adoption dimension, no corroborating documentation, and a truncated body. It is not lower because the descriptive core - storage location, pricing inputs, index tables, phase order, dimension math and Mview fallback behaviour - is specific enough for a reader to verify directly on a Magento install, and the one piece of arithmetic supplied checks out.
build
Magento's inventory_reservation is a housekeeping bill that arrives as a hosting bill1 distinct publisher
build
Your Magento admin is slow because order state lives in fifteen tables, not because Varnish is off1 distinct publisher
build
TiDB quietly turns primary-key ORDER BY into a TopN, and the fix is not in v8.5.71 distinct publisher
build
Four indexes, none of them covering: the 78-second page and the one index that fixed it1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 19, 2026