Magento

Why Magento 2 Stores Slow Down in Thailand, and How to Actually Fix It

Magento 2 is capable of genuinely fast storefronts, but most Thai installs are running well below that ceiling. The specific, well-understood causes — indexing, caching, extension bloat — and the order to fix them in.

BangkokSync6 min read

"Magento is slow" is one of the most common complaints we hear about a platform that, configured correctly, is capable of genuinely fast storefronts at real catalogue scale. The gap between that ceiling and what most Thai installs actually deliver almost always comes down to a small set of well-understood causes — not a fundamental limitation of the platform itself.

Indexers are the first place to look

Magento 2 pre-computes catalogue, price, and search data through indexers rather than calculating it live on every page request — that's the whole point of the architecture. The problem shows up when indexers are left on "Update on Save" instead of "Update by Schedule." On a catalogue of any real size, every product or price change then triggers a synchronous reindex during the save operation itself, which can make the admin sluggish and, in the worst configurations, affect storefront responsiveness during that reindex window. Switching to scheduled indexing and letting cron handle it in the background is usually the single highest-leverage fix available, and it's frequently left at the default.

Full page cache needs Varnish to do its real job

Magento 2 ships with a built-in full page cache, but running it on the default file-based cache backend instead of Varnish leaves significant performance on the table — Varnish sits in front of the application entirely and serves cached pages without PHP or the database being touched at all, which is a different order of speed than even a well-configured built-in cache. For a store still on the default cache configuration, this is frequently the second-highest-leverage fix after indexing.

Redis, not files, for cache and session storage

The default file-system cache and session storage work, but they don't scale well under concurrent traffic — file locking becomes a real bottleneck once multiple requests are hitting the same session or cache files simultaneously. Moving both cache and session storage to Redis removes that contention and is standard practice for any Magento 2 store expecting real traffic, not an advanced optimization reserved for enterprise deployments.

Extension bloat is the quiet killer

Every third-party extension that hooks into Magento's event/observer system or adds a plugin around a core class runs on every relevant page load, whether or not that page actually uses the extension's feature. A store running fifteen or twenty extensions — payment gateways, shipping calculators, marketing tools, admin conveniences — is paying that cumulative cost on every request. The fix isn't necessarily removing extensions wholesale; it's auditing what's actually installed, checking which ones are genuinely still in use, and profiling the ones suspected of being heavy rather than guessing.

Database tuning is easy to forget entirely

MySQL's own configuration is frequently left at defaults that were never sized for the database a real Magento catalogue produces. The InnoDB buffer pool — the memory MySQL uses to cache data and indexes rather than reading from disk — is one of the highest-impact settings to get right, and a default sized for a generic install rather than the actual database size on disk quietly forces far more disk I/O than necessary on every query. Slow-query logging, left on temporarily during a performance investigation, is usually the fastest way to find out which specific queries — often from a poorly written extension, not core Magento — are actually costing the most time.

Extension conflicts show up as more than just weight

Beyond the cumulative cost of extensions running on every page, two extensions modifying the same area of checkout or catalogue logic can create conflicts that show up as inconsistent behaviour rather than an obvious error — a discount that sometimes doesn't apply, a shipping method that occasionally disappears. These are genuinely difficult to diagnose without disabling extensions systematically to isolate the interaction, and they're a strong argument for keeping the extension list as lean as the business genuinely needs, rather than accumulating one for every feature request that comes up.

Monitoring catches regressions before customers report them

A store that passes a performance audit today can regress within months as new extensions get added, catalogue size grows, or a marketing campaign introduces JavaScript nobody profiled. Application performance monitoring — even a lightweight setup that tracks response times and flags slow database queries — catches this drift while it's still small, rather than waiting for page-load complaints to surface it after it's already cost weeks of degraded conversion.

Images and the theme layer

Magento's own image resizing can generate an unreasonable number of cached image variants if a theme isn't configured carefully, and unoptimised source images multiply that problem. A custom theme that wasn't built with performance in mind — excessive DOM complexity, unminified assets, render- blocking scripts in the head — compounds on top of a well-tuned backend, so backend tuning alone won't fix a front-end that was never built lean.

A content delivery network is not optional at this point

Serving static assets — images, CSS, JavaScript — directly from the origin server rather than through a CDN adds latency for every visitor outside Bangkok, and for a Thai store with any regional or international traffic, that latency compounds with everything else already covered here. A properly configured CDN is a comparatively simple, low-risk addition against the effort involved in the backend tuning above, and it's worth confirming it's actually in place and actually caching what it should be — a misconfigured CDN that's bypassed on every request provides none of the benefit while adding a false sense that the problem is handled.

The order that actually works

Fixing all of this at once is rarely necessary or realistic. The order that produces results fastest, based on what we see most often:

  1. Switch indexers to Update by Schedule if they aren't already — free, immediate, and the most common single misconfiguration.
  2. Move sessions and cache to Redis if still on file-based storage.
  3. Get Varnish properly configured for full page cache, including cache headers set correctly by the application so Varnish actually caches what it should.
  4. Audit the extension list and profile the ones under suspicion, rather than removing at random.
  5. Only then look at theme-level and image optimization — it matters, but it's fighting for a much smaller share of the total problem than the backend configuration above.

Where this connects to hosting

None of this works on hosting that can't actually run it — Varnish and Redis both need to be properly provisioned and configured at the infrastructure level, not bolted on as an afterthought. This is part of why cloud hosting decisions and Magento performance are really the same conversation, not two separate ones: a well-tuned application on under-provisioned hosting still performs poorly, and well-provisioned hosting running a misconfigured application wastes the investment in the other direction.

The takeaway

A slow Magento store is rarely a reason to question the platform choice itself — it's usually a specific, diagnosable configuration gap: indexers left on the wrong mode, a cache backend that was never upgraded past the default, or an extension list nobody has audited since launch. Fixing these in the right order gets most stores back to the speed the platform was always capable of, without needing a rebuild.

Want a real performance audit of your Magento store, not just a Lighthouse score?

We'll check indexers, cache backend, and your actual extension list, and tell you which one is costing you the most.