Open source · GPL v2

The same table, served two ways.

ShannonBase keeps a columnar mirror of your InnoDB tables in memory and routes each query to whichever engine wins — no ETL, no second system, no application change. And it does AI where your data lives: a native VECTOR type with in-kernel embeddings, train-and-predict from plain SQL, local LLM generation with RAG, and a native agent runtime and system agent that complete user tasks from natural language.

Wire-compatible with MySQL 8.4. Your driver, your ORM, your dump files.

playground · read-only · TPC-H SF 0.2 shared instance
⌘ + Enter

ShannonBase v0.1 · MySQL 8.4 wire · Linux x86_64 · 8 vCPU / 32 GB · TPC-H SF 0.2 · static preview · Testing Database pulled via docker pull shannondata/shannonbase:0.1-tpch

Drops into what you already run mysql-connectorJDBCGo sql-driver SQLAlchemyPrismamysqldumpProxySQLCanal

What the mirror buys you

One engine, four workloads.

Analytics without a warehouse

Load a table into the in-memory column store and the optimizer starts routing scans there on its own. Changes propagate from InnoDB continuously.

ALTER TABLE lineitem SECONDARY_LOAD

Vectors without a vector database

A native vector type with an ART index, in the same transaction as the row it describes. Embeddings generated in-process.

ORDER BY vector_distance(v, ?)

Models without a pipeline

Train on a table and predict from SQL. LightGBM and ONNX Runtime live in the server, so the data never moves.

CALL sys.ml_train('churn', ...)

Agents inside the kernel

A JavaScript runtime with an in-process SQL bridge. Every write goes through human approval before it commits.

CALL sys.shannon_chat(?, @out)

Architecture

A mirror, not a copy job.

Rapid is a secondary engine, not a downstream replica. Committed changes reach the column store over two channels — the redo log for durability and a DML notification path for latency — so analytical reads see transactional writes without a sync window you have to reason about.

MVCC version linking runs in the column store too, which is what lets a long analytical scan and a short transaction coexist on the same table.

InnoDB row store on disk Rapid · IMCS column store in memory redo log DML notification Optimizer cost-based routing per query one SQL statement in

TPC-H SF 0.2 · developer build (debug) · full 22-query run · 2026-08-31

Numbers you can reproduce.

QueryInnoDBRapidSpeedup
Q11 — important stock identification56.6 s0.9 s60.9×
Q7 — volume shipping106.1 s2.4 s45.0×
Q20 — potential part promotion> 150 s6.6 s> 22×
Q17 — small-quantity-order revenue> 150 s7.7 s> 19×
Q5 — local supplier volume22.2 s1.9 s11.6×
Q8 — national market share56.4 s5.8 s9.8×
Q3 — shipping priority33.4 s4.9 s6.9×
Q14 — promotion effect15.2 s2.2 s6.9×
Q21 — suppliers who kept orders waiting107.6 s18.3 s5.9×

Harness, dataset generation, and raw output are in heatwave-tpch. Run it against your own hardware before you believe us.

Live demos

See it run, on YouTube.

Engine routing, vectors, in-database ML, RAG, and the agent — running live. Everything below is also on the ShannonBase Data AI channel.

All live demos on YouTube

News

What we shipped lately.

release

Vectorized hash join lands in Rapid

Batched build and probe phases with SIMD-accelerated predicate evaluation, plus fixes to aggregate overflow handling.

release

Agent approval workflow is now durable

Plan rows commit independently of the approval wait, so a pending decision no longer holds a transaction open.

event

Talk: keeping a column store honest under MVCC

How version linking works in IMCS, and the correctness bugs we found building it.

All news

Get started

Running in about a minute.

  1. Start the server. One container, no external dependencies.
  2. Connect with any MySQL client. Port 3306, the protocol you already speak.
  3. Mirror a table. One DDL statement puts it in the column store.
  4. Query as usual. The optimizer decides which engine answers.
$ docker run -d -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=secret shannonbase:latest
 
$ mysql -h 127.0.0.1 -u root -p
 
mysql> ALTER TABLE lineitem SECONDARY_ENGINE = RAPID;
mysql> ALTER TABLE lineitem SECONDARY_LOAD;
mysql> SELECT sum(l_quantity) FROM lineitem;