MySQL 8.4 / 9.7 / 26.10 + MariaDB 12.3 · fashion-mnist-784 · published ground truth · generated 2026-11-03 10:31:12 UTC
cross-engine · MySQL version comparison
MyVector's native HNSW vector search on a real ann-benchmarks dataset (fashion-mnist-784-euclidean: 60,000 × 784-d image embeddings, L2), scored against the dataset's published exact ground truth — the ann-benchmarks recall methodology, not a brute-force self-check. Queries come from the dataset's held-out test set (never indexed). Same engines and hardware as the synthetic dashboard; this one answers "what recall/throughput do you actually get on real embeddings?"
| Metric | MySQL 8.4 | MySQL 9.7 | MySQL 26.10 | MariaDB 12.3 · MHNSW |
|---|---|---|---|---|
| Index build (s) | 82.5 | 83.1 | 85.0 | 245.5 |
| Insert QPS | 1,162 | 1,164 | 1,140 | 244 |
| Exact KNN QPS | 0 | 0 | 1 | 0 |
| KNN p50 (ms) | 3,991.4 | 3,633.9 | 1,621.7 | 4,930.9 |
| KNN p99 (ms) | 4,435.4 | 4,229.2 | 1,845.9 | 5,353.3 |
| ANN QPS | 349 | 355 | 354 | 585 |
| ANN p50 (ms) | 2.8 | 2.8 | 2.8 | 1.6 |
| ANN p99 (ms) | 3.5 | 3.4 | 3.4 | 3.3 |
| Recall@10 | 0.999 | 0.999 | 0.999 | 1.000 |
fashion-mnist-784-euclidean (ann-benchmarks) — 60,000 train × 784-d, 10,000 held-out test queries, L2/Euclidean. Index HNSW M=16, ef_construction=200.mhnsw graph cache lazily over the first ~1k queries, so a cold first-query measurement would understate it.mhnsw_max_cache_size raised to 1 GiB (its 16 MB default thrashes to disk). MariaDB builds HNSW online during insert, so its "index build" is load time (no separate build phase) — much slower here (~240 s) but, once warm, its search is competitive-to-faster than MyVector on this dataset at recall ≈ 1.0.mhnsw_ef_search to ~2×M (=32), so its ef_search=10 point is below even M=16 and hits an edge path that mis-measures low — the rest of its curve (ef≈20→800) is monotonic once each point is warmed per-ef. Read MariaDB from ef≈20 up; the headline uses the warm ef=200 point.