Custom fields turn one post into fifty rows. That is fine until something queries them, and then the postmeta table is the whole performance story.
Everything here follows from ACF storing each field as its own row, plus a second row describing it.
A field group with twenty fields writes forty rows per post, half of them the hidden reference keys. Indexes are set for the key and value lookups templates actually make.
A repeater with ten rows of five fields is a hundred meta rows for one post. Those reads are grouped and cached rather than fetched one field at a time.
An ACF options page stores its values as a single site option that loads on every request. Left autoloading, a large one is added to the cost of the entire site.
Local JSON keeps field definitions in the repository rather than the database, and the directory it writes to stays writable so a deploy does not silently stop syncing.
Removing a field group orphans its data rather than deleting it, but removing the wrong one is still a bad afternoon. Daily backups make it undoable.
Modelling content properly with ACF is the right call and it multiplies row counts. The hosting job is making that multiplication cheap rather than talking you out of it.
An ACF-built template pulls dozens of values per post, and on an archive that is dozens times the number of posts on the page.
One design decision drives all of it: every field is a row, and templates read many of them at once.
| Setting | What we do | Why |
|---|---|---|
| Postmeta indexing | Indexed for key and value lookups together | ACF stores each field as its own row plus a hidden reference row, so a twenty-field group is forty rows per post before any repeater. |
| Repeater reads | Fetched as one grouped query per post | A repeater row is a set of meta keys with a numeric prefix, and reading them individually is one query per field per row. |
| Options page storage | Kept out of the autoloaded options table | An options page loads as a single site option on every request, so a large one adds its weight to pages that never reference it. |
| Local JSON directory | Kept writable through deploys | Field group syncing silently stops when the directory is not writable, and nobody notices until two environments have different definitions. |
| Orphaned meta | Reviewed rather than pruned automatically | Deleting a field group leaves its data behind, which is recoverable data and not something a host should decide to remove. |
Every plan includes free migration, daily backups, SSL and 24/7 support.
Move the build across — migration is free, field groups included.