Performance

Magento Index Management: On Save vs On Schedule

Indexing decides whether the storefront tells the truth. Here is how indexers work, when to use update on save versus schedule, and how to keep them healthy.

Jason Schuman · March 7, 2026

Indexing decides whether the storefront shows current data

Magento does not calculate every category page, price, and search result from raw database records during the customer request. Its indexers prepare denormalized tables that the storefront can read quickly.

When an index is current, customers see the latest prices, stock, categories, and search results. When an index falls behind, the page can load quickly and still show old or missing data.

The choice between update on save and update on schedule decides when Magento pays the indexing cost. One mode slows the write that caused the change. The other keeps the write fast and makes cron process the change later.

Don't reindex every save. Batch the work.

What the indexers do

Each Magento indexer prepares one kind of derived data. Price, stock, catalog category relationships, catalog rules, and full-text search each have their own indexer or index group.

Run bin/magento indexer:info to list the indexers installed in the store. An indexer reads source records and writes tables arranged for storefront queries, so a category page does not have to calculate every relationship while the customer waits.

The index is useful only when it matches the source data. A fast query against an old price or stock value is still a storefront error.

Update on save versus update on schedule

Update on save reindexes affected data during the write that changed it. The product save waits for that work to finish, so the storefront becomes current sooner.

Update on schedule records the change and lets cron process it later. The product save returns sooner, but the storefront can show the previous value until the scheduled work finishes.

Update on save trades faster data freshness for slower writes. Update on schedule trades a short delay for faster writes and batched background work. Busy production stores usually need schedule with healthy cron.

Why busy stores use update on schedule

On a store with frequent catalog changes, update on save makes every write carry indexing work. A bulk update can trigger a long series of synchronous reindex operations while the import or admin request is still open.

That makes imports crawl and makes product saves feel broken. One hundred changed products can create one hundred immediate indexing events, with repeated work across the same price, category, or stock data.

Update on schedule moves the work into cron. Magento records the changes, processes the pending records in the background, and gives the indexer a chance to handle a batch while the catalog write stays fast.

The changelog behind scheduled indexing

Scheduled indexing uses Magento's materialized view mechanism. In this context, the index table is a prepared view of source data, and Magento tracks source changes so it can update the view in smaller pieces.

When an indexer runs on schedule, Magento writes change records to a changelog table for that indexer. These tables commonly use a _cl suffix. The record identifies the changed entity and gives the indexer a position to process.

Cron reads the changelog and sends the changed entities through the indexer. It processes deltas instead of rebuilding the entire catalog after every product save. If cron stops consuming the changelog, the pending rows accumulate and the storefront eventually falls behind.

Set and verify the indexer mode

Set scheduled processing with bin/magento indexer:set-mode schedule. The realtime option switches an indexer back to update on save, for example with bin/magento indexer:set-mode realtime.

You can set a mode for one indexer or for all indexers. Use schedule for busy production catalogs only when the cron groups that process Magento work are running on time.

Use bin/magento indexer:show-mode to confirm the configured mode. Use bin/magento indexer:status to inspect valid or invalid state and scheduled processing details. Read both when storefront data looks stale.

When scheduled indexing falls behind

Scheduled indexing depends on cron. If a cron group is disabled, failing, blocked by a long-running job, or too slow for the catalog workload, the changelog grows faster than the indexer can consume it.

The storefront then shows familiar symptoms: new products do not appear, price changes do not reflect, and stock values stay old. The index may still be valid according to its last completed run while newer changes wait in the changelog.

Start with cron health and the changelog backlog before forcing a full rebuild. A reindex can refresh data, but it will not fix a cron group that keeps failing after the command exits.

Scheduled indexing is only as current as the cron that consumes the changelog.

Choose price-index dimensions carefully

The price index has a dimension mode that controls which versions of a price Magento stores. A dimension can be a website, a customer group, or the combination of both.

Use bin/magento indexer:set-dimensions-mode to configure the price index dimension mode supported by the Magento version. A store with website-specific prices needs website dimensions. A store with customer-group pricing needs customer-group dimensions. A store using both needs the combined mode.

Every added combination creates more price-index rows and more work during a reindex. Measure index size and reindex time after a dimension change. Do not choose a larger mode just because the server has room today.

Reindex manually when the cause is understood

Use bin/magento indexer:reindex after a bulk change, a repaired indexer, or a planned data rebuild. You can target specific indexers by adding their IDs to the command.

A full reindex consumes CPU, database time, and disk work on a large catalog. Run it in a maintenance window or an approved low-traffic period. A targeted reindex reduces the work when one index is stale.

Fix the underlying cron, data, or configuration problem before treating the reindex as complete. A successful command can be followed by another backlog if the scheduled process is still failing.

Plan indexing with large imports

Large imports expose the difference between the two modes. With update on save, every imported change can trigger synchronous index work. The import spends time recalculating data that will be changed again by the next rows.

With update on schedule, the import writes changes and returns while the changelog records the affected entities. Cron processes the deltas afterward, so the storefront can lag until the backlog reaches zero.

For a very large load, an approved import runbook may suspend normal incremental processing and run one rebuild at the end. That creates a known stale-data window. Tell the business when it starts, monitor the import, and confirm the final indexes before reopening normal traffic.

Check behavior against your Magento version

Magento 2.4.x releases have changed indexer internals, cron behavior, and batching details over time. The commands and operating principles stay recognizable, but the exact failure messages and workload can vary by release and installed extensions.

Test the release you run. Confirm which cron group processes the indexer, how quickly the changelog is consumed, and how the price dimension mode affects the catalog at production-like volume.

For a busy production store, update on schedule is usually the practical operating mode. Update on save fits development, small catalogs, and cases where immediate freshness is worth the write cost.

Which indexers affect the storefront most

Every indexer deserves a valid state, but customer-visible symptoms often point to a small set:

  • The price index, which grows with website and customer-group dimensions.
  • The catalog category and product relationship indexes, which control category-page membership.
  • The stock index, which supplies salable quantity and availability data.
  • The full-text search index, which supplies catalog search results.

Use the symptom to choose the first indexer to inspect. Wrong prices point to the price index. Missing search results point to full-text search. Wrong availability points to stock. Missing category products point to category or product relationship indexes.

Read the indexer status

Use bin/magento indexer:status as the first check for an indexing problem. Read the indexer state, update requirement, and schedule information. Use bin/magento indexer:show-mode when you need the configured update mode.

Valid means Magento has processed the known source changes for that index. Invalid means the index needs work or a change is waiting to be processed. On a healthy scheduled store, an invalid state should clear after cron processes the backlog.

An indexer that stays invalid needs investigation. Cron may not be processing its changelog, a reindex may be failing, or the indexer may be blocked by another database or worker problem.

When the invalid state never clears

A persistently invalid indexer is a specific failure to trace. Check the cron group, recent cron output, the Magento log Directory, and the changelog size. Then run a targeted reindex so the command exposes any database or application error.

An indexer stuck invalid means the storefront can serve data that no longer matches the source. Fix the cron or reindex failure before treating the status as healthy.

Run the reindex only after checking the current load and the affected index. Record the command output and the code DIFF if a deployment or configuration change caused the failure. The final state should return to valid and the changelog should continue to move.

Control indexing during bulk work

For a very large catalog operation, repeated incremental work may cost more than one planned rebuild. Use a tested import runbook that controls when indexers process changes and runs the affected reindexers after the load.

Run the import, monitor its errors and database load, then execute the targeted or full bin/magento indexer:reindex required by the change. Confirm every affected index returns to valid before normal traffic depends on it.

The storefront may show old data during the import and rebuild. Use a maintenance window, communicate the stale-data period, and keep a rollback or recovery step for a failed import.

Account for multi-website and multi-store work

Multiple websites, store views, customer groups, currencies, and catalog rules increase the combinations Magento must index. The price index grows quickly when prices differ across websites or customer groups.

Price-index dimension mode controls how some of that work is partitioned. A mode that fits one website may create unnecessary rows on another store. A mode that is too small may fail to represent the prices the storefront needs.

Measure reindex time, index size, database load, and changelog growth on production-like data. A job that finishes quickly on one website can become a long backlog across many websites and groups.

Monitor the changelog

Changelog tables provide an early signal for scheduled indexing. When cron keeps up, new rows are consumed soon after Magento writes them. The table may contain rows at any moment, but its size should stay within a normal range for the store.

A steadily growing _cl table means the consumer is falling behind. Check the cron schedule, the indexer process, long database queries, worker errors, and the rate at which new catalog changes arrive.

Set a baseline for each important changelog and alert on sustained growth. The team can then investigate before shoppers see a long delay in new products, prices, or stock.

A growing changelog is an early warning that scheduled indexing is falling behind.

Common indexing mistakes

These mistakes turn indexing from background work into a storefront problem:

  • Running indexers on save on a busy store, so imports and admin saves wait on repeated index work.
  • Running on schedule while cron is unhealthy, so the changelog grows and the storefront falls behind.
  • Starting a full reindex at peak traffic instead of using a planned low-traffic window.
  • Ignoring a persistently invalid indexer until customers report stale prices, stock, or search results.

Each mistake is visible in command output, cron records, changelog growth, or storefront tests. Use those signals before changing database settings or application code.

Separate indexing from cache invalidation

Indexing and cache invalidation are related, but they are different operations. A product save can clean cache tags, while the indexer updates derived price, category, stock, or search tables.

A large catalog update can trigger both kinds of work. The import may clean many cached pages while scheduled indexing builds a backlog. Customers can then see slower responses and old derived data at the same time.

Plan heavy imports and full reindexes for a low-traffic window. After the index is current, warm the important public pages and confirm that cache purges removed stale responses.

Reset only when a full rebuild is required

bin/magento indexer:reset marks the indexers invalid. It does not perform the rebuild itself. The next scheduled or manual indexing run must process the invalid indexes.

Resetting every index creates more work than a targeted reindex and leaves more storefront data waiting for refresh. Use it after a major data or configuration problem when a clean rebuild is the right recovery path.

Record why the reset happened, run the required reindex, and verify valid status afterward. A targeted reindex is the normal option when one indexer needs repair.

Test index changes on staging

Changing indexer modes or price dimensions changes both data freshness and resource use. Test the change before production. A setting that helps a small catalog can create a long queue on a larger one.

Use staging data close to production in catalog size, websites, customer groups, rules, and extension behavior. Measure save time, import duration, reindex time, database load, changelog growth, and storefront freshness before and after the change.

Keep the configuration DIFF with the deployment record. Make the test Reproducible, record the output in the project Directory, and verify the same commands on the production release before scheduling the change.

The payoff is current storefront data

Current index tables let category pages, search, prices, and stock read prepared data quickly. The performance gain depends on the index matching the source records.

A healthy store serves current prices, products, search results, and availability without making each customer request calculate the entire catalog. A lagging index can show old data and push some requests onto slower fallback work.

Indexing stays invisible when the mode, cron, changelog, and reindex runbook are healthy. The failure becomes visible through stale content, slow admin saves, long imports, or a status that never returns to valid.

Keep indexing healthy with a simple runbook

Check the configured mode with bin/magento indexer:show-mode. Check state and schedule output with bin/magento indexer:status. Keep scheduled indexers on a cron path that is monitored and tested.

Watch the _cl tables for sustained growth. Plan large imports, dimension changes, resets, and full bin/magento indexer:reindex runs for a low-traffic window.

Keep the mode decision, configuration DIFF, cron evidence, and Reproducible test results in the project Directory. If an indexer stays invalid, preserve the logs and command output before running repeated rebuilds.

Use update on schedule for production catalogs with regular change when cron can keep up. Use update on save for development or small catalogs where immediate freshness is worth the write cost. The right mode is the one the team can monitor, test, and recover.