Skip to content

Why MySQL FULLTEXT is Slow

MySQL FULLTEXT search becomes painfully slow as your data grows. Here's why, and how MygramDB solves it.

The Problem

The two architectures answer the same query through completely different data paths: one round-trips through disk-resident structures, the other stays entirely in RAM.

Disk I/O Bottleneck

MySQL FULLTEXT stores indexes on disk using B-tree pages. Every search query requires:

  1. Reading B-tree pages from disk
  2. Loading posting lists into memory
  3. Sorting results (often with external sort)

Even with SSDs, this I/O overhead can add milliseconds or seconds per query.

What is a posting list?

A posting list is the list of document IDs that contain a given term. Full-text search finds candidates by combining these lists with AND/OR. See the Glossary for more.

Uncompressed Posting Lists

MySQL stores posting lists without compression. For common terms matching millions of rows, this means:

  • Reading megabytes of data per query
  • Memory pressure on buffer pool
  • Cache thrashing under concurrent load

Cache Dependency

Performance varies significantly between cold and warm cache. The published benchmark disables MygramDB's query cache so that search-engine work, rather than cache hits, is measured.

In production, cache is often cold after restarts, deployments, or buffer pool contention.

Concurrency Collapse

Under concurrent load, MySQL FULLTEXT throughput can drop dramatically. The cache-off results for 1 and 4 connections are maintained on the benchmark page, together with the test configuration.

The Solution: MygramDB

MygramDB solves these problems with a fundamentally different architecture:

In-Memory Index

All data lives in RAM. Zero disk I/O during queries.

Compressed Posting Lists

Delta encoding + Roaring bitmaps reduce memory usage by 60-80% while enabling faster intersections.

SIMD-Accelerated Operations

Bitmap intersections use CPU SIMD instructions for maximum throughput.

Consistent Performance

The index stays in memory, so a search does not need to read MySQL's FULLTEXT index. See Benchmarks for cache-off measurements.

Real-time MySQL / MariaDB Sync

GTID-based binlog replication keeps MygramDB in sync with MySQL 8.4/9.x or MariaDB 10.6+/11.x. No ETL pipelines, no data staleness.

What is ETL?

ETL stands for extract, transform, load — the pipeline that copies data from one system into another. MygramDB reads the MySQL binlog directly, so there is no separate sync job to build and operate.

When to Use

MygramDB is ideal for:

  • High-traffic web services — E-commerce, news sites, Q&A platforms with many concurrent users
  • Real-time search requirements — When users expect instant results
  • FULLTEXT queries >100ms — Slow searches hurting user experience
  • Search fails under load — Timeouts during traffic spikes

Ready to try it? See Quick Start or GitHub for full documentation.