{"id":8216,"date":"2026-09-02T01:01:04","date_gmt":"2026-09-01T23:01:04","guid":{"rendered":"https:\/\/launix.de\/launix\/?p=8216"},"modified":"2026-09-02T01:01:05","modified_gmt":"2026-09-01T23:01:05","slug":"memcp-beta-release-0-9-one-database-for-transactions-search-and-analytics","status":"publish","type":"post","link":"https:\/\/launix.de\/launix\/en\/memcp-beta-release-0-9-one-database-for-transactions-search-and-analytics\/","title":{"rendered":"MemCP Beta Release 0.9: One Database for Transactions, Search, and Analytics"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Today we are releasing MemCP 0.9 as a public beta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP is a persistent main-memory database designed to run existing SQL applications without giving up the advantages of a compact, column-oriented engine. Applications can connect through the MySQL protocol, send MySQL- or PostgreSQL-style SQL over HTTP, use the built-in REST router, or query RDF data with SPARQL. Data remains durable on disk while frequently used columns, indexes, and intermediate results stay close to the CPU.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The 0.9 release marks a change in what MemCP is ready to do. The first public release demonstrated the storage model and broad SQL support. The engineering work summarized in our&nbsp;<a href=\"https:\/\/launix.de\/launix\/en\/memcp-engineering-update-mar-9-aug-26-2026\/\">August update<\/a>&nbsp;showed that the same architecture could handle a demanding real application. MemCP 0.9 brings those pieces together as a database people can install, connect to existing software, observe, benchmark, and begin validating for real deployments.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is still a beta, not a claim that every SQL edge case or operational environment is finished. It is, however, the point at which MemCP has become much more than a fast column scan: it is a complete database system with transactions, automatic physical optimization, crash recovery, memory management, migration tools, protocol compatibility, and an administration dashboard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What MemCP 0.9 Can Do<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Run Existing MySQL Applications<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP exposes a MySQL-compatible TCP server and Unix socket. Existing connectors, PDO applications, command-line clients, prepared statements, authentication flows, and administration tools can talk to it without a MemCP-specific driver.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The supported SQL surface now covers the workload expected from a modern business application:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SELECT<\/code>,\u00a0<code>INSERT<\/code>,\u00a0<code>UPDATE<\/code>,\u00a0<code>DELETE<\/code>, upserts, and\u00a0<code>INSERT ... SELECT<\/code><\/li>\n\n\n\n<li>inner, outer, cross, and multi-table joins<\/li>\n\n\n\n<li>scalar,\u00a0<code>IN<\/code>,\u00a0<code>EXISTS<\/code>,\u00a0<code>NOT EXISTS<\/code>, and correlated subqueries<\/li>\n\n\n\n<li><code>GROUP BY<\/code>,\u00a0<code>HAVING<\/code>, distinct results, common aggregates, and\u00a0<code>GROUP_CONCAT<\/code><\/li>\n\n\n\n<li><code>UNION<\/code>\u00a0and\u00a0<code>UNION ALL<\/code>, including ordered and correlated forms<\/li>\n\n\n\n<li>derived tables, logical views, complex expressions, and JSON functions<\/li>\n\n\n\n<li>window functions such as\u00a0<code>ROW_NUMBER<\/code>,\u00a0<code>RANK<\/code>,\u00a0<code>LEAD<\/code>, and\u00a0<code>LAG<\/code><\/li>\n\n\n\n<li>triggers with\u00a0<code>OLD<\/code>\u00a0and\u00a0<code>NEW<\/code>\u00a0values, including query-backed trigger bodies<\/li>\n\n\n\n<li>prepared binary values, session variables, collations, date\/time functions, and timezone-aware conversion<\/li>\n\n\n\n<li>schema inspection through the common\u00a0<code>SHOW<\/code>\u00a0and\u00a0<code>INFORMATION_SCHEMA<\/code>\u00a0interfaces<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Compatibility work in 0.9 was driven by unmodified application queries, database checkers, plugins, notifications, generated read models, and dump\/restore tools. This matters more than accepting isolated syntax: the parser, planner, transaction layer, and result protocol now cooperate on the shapes real software actually produces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP also provides HTTP endpoints for MySQL-dialect SQL, PostgreSQL-dialect SQL, Scheme, and SPARQL. Applications can register custom HTTP routes in Scheme and execute directly against the storage engine without another application-server-to-database network hop.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Keep Data Durable While Serving It from Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP is not an ephemeral cache. Its default&nbsp;<code>safe<\/code>&nbsp;engine persists data with a write-ahead log and recovery path designed for power-loss safety. The&nbsp;<code>logged<\/code>,&nbsp;<code>sloppy<\/code>,&nbsp;<code>memory<\/code>, and&nbsp;<code>cache<\/code>&nbsp;engines offer explicit alternatives for workloads with different durability and reconstruction requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tables are divided into independently managed shards. Each shard stores columns separately and selects a compact representation according to the data: bit-packed integers, decimal encodings, dictionaries, prefixes, sparse values, sequences, constants, or compressed string storage. Queries read only the columns they need. Cold persistent data can leave RAM without being deleted from disk and is loaded again when required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Release 0.9 substantially strengthens this operational foundation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>shard rebuilds and repartitioning publish new generations atomically<\/li>\n\n\n\n<li>concurrent inserts, updates, and deletes survive generation switches<\/li>\n\n\n\n<li>WAL replay restores committed changes after a crash<\/li>\n\n\n\n<li>persistent blob references and large WAL records survive restart<\/li>\n\n\n\n<li>orphaned blob and shard files can be reclaimed without connecting cleanup to normal cache eviction<\/li>\n\n\n\n<li>memory accounting separates owned structures and gives eviction an accurate budget<\/li>\n\n\n\n<li>cold shards, indexes, computed columns, and reconstructible caches can be released under pressure<\/li>\n\n\n\n<li>background maintenance avoids deleting persistent data and keeps the previous valid generation if publication fails<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a hot working-set database rather than a requirement that every byte remain permanently resident. MemCP can use available memory aggressively while retaining an explicit durability contract.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Optimize Queries Without Manual Index Administration<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP builds and maintains physical access paths from the workload. Users do not have to predict every useful compound index in advance or run a manual&nbsp;<code>ANALYZE<\/code>&nbsp;cycle before the optimizer can improve.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The query compiler separates SQL meaning from physical execution:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The parser builds the SQL syntax tree.<\/li>\n\n\n\n<li>Correlated subqueries are decorrelated into a combined logical graph.<\/li>\n\n\n\n<li>Logical optimization and join reordering consider the complete query, including formerly dependent joins.<\/li>\n\n\n\n<li>Physical lowering chooses scans, ordered scans, probes, cached groups, computed columns, and row-ID sets using a calibrated cost model.<\/li>\n\n\n\n<li>The resulting Scheme program is optimized and cached as an executable query-plan callable.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">This separation is one of the central achievements of 0.9. A permission check expressed as nested&nbsp;<code>CASE<\/code>,&nbsp;<code>COALESCE<\/code>,&nbsp;<code>EXISTS<\/code>, and scalar subqueries is no longer forced down one hard-coded execution path. The compiler can choose independently at different nodes of the plan: probe a unique key, scan an index range, build a reusable group, project a candidate set through a join, or evaluate a residual predicate in batches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Physical decisions use table cardinality, selectivity, distinct counts, ordering, limits, projected work, and runtime guards. When better statistics become available or data growth crosses a decision boundary, a cached plan can be recompiled instead of remaining tied to an obsolete assumption. A calibration suite measures the real storage operators and generates the constants used by the cost model; performance-sensitive pull requests are also compared against master across a checked-in workload pool.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cached plans no longer expire merely because the regular background rebuild published a new statistics generation. The common path compares an immutable generation token; after a generation change, a precomputed coarse fingerprint checks whether planner-relevant dimensions such as cardinality, distinctness, null fraction, width, and confidence are still in the same cost class. Similar data keeps the compiled plan. Material growth or a crossed cost boundary still falls through to recompilation. This removes the periodic cold-plan pause without freezing a plan across meaningful data changes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Search, Filter, and Paginate Large Tables<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP 0.9 combines several mechanisms for interactive search over large business datasets:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Adaptive automatic indexes<\/strong>&nbsp;recognize equality, range, ordering, and indexable matcher boundaries. Non-prefix&nbsp;<code>LIKE '%term%'<\/code>&nbsp;predicates can use a shard-local bigram candidate index. The original SQL predicate remains the correctness authority, so an approximate candidate set can skip most rows without changing the result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>RecSets<\/strong>&nbsp;represent query-local sets of physical row IDs. A RecSet chooses ranges for clustered matches, sorted ID lists for sparse matches, or bitmaps for dense scattered matches. Sets can be intersected, united, negated, counted, scanned, and projected through join keys without copying complete rows.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ordered scans with braking<\/strong>&nbsp;exploit an index that already supplies the requested order. For&nbsp;<code>ORDER BY ... LIMIT<\/code>, the engine can stop when later candidates cannot enter the result. When a selective RecSet and a different ordering index compete, the scan operator can choose between walking the ordered index with membership checks and sorting the sparse candidates by their inverse index positions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Batch acceptance<\/strong>&nbsp;helps when a cheap condition can produce candidates but an expensive permission predicate must still be checked. The engine pulls a bounded candidate batch, evaluates the remaining condition, and expands the batch only if it has not filled the requested page.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These are general operators rather than a special full-text subsystem. The same machinery can combine text search, tenant or location restrictions, access-control subqueries, an ordering requirement, and a page limit. Low- and high-selectivity searches can therefore choose different execution paths from the same SQL shape.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Reuse Computation Safely<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Main-memory execution is most valuable when repeated work is recognized across rows and queries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP can create computed columns for recurring expressions and scalar lookups. A lookup such as fetching a value through a stable foreign key can become a lazily computed column on the referencing table. Canonical naming allows compatible queries to reuse it, while dependency tracking invalidates the affected row when a bound key or source value changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For aggregation, group caches preserve reusable partial results and update them as base data changes. Permission-aware counts can sometimes be evaluated once per low-cardinality group rather than once per fact row. Query-local scalar and membership carriers avoid rebuilding the same subquery result for every projection or filter occurrence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Reuse is always scoped by its dependencies. Session-bound permissions do not leak between users, transaction-visible values are not published as global facts, and residual correlated expressions remain inside the row scope that supplies their keys.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Serve Small OLTP Requests and Large Scans in One Engine<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Earlier MemCP versions were most obviously strong when a query touched enough data for compression, columnar access, and parallelism to dominate. Version 0.9 also reduces the fixed cost of tiny requests.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On a realistic WordPress-style fixture with 8,214 posts and 75,000 metadata rows, serial requests through the MySQL protocol measured:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Query<\/th><th class=\"has-text-align-right\" data-align=\"right\">MemCP 0.9<\/th><th class=\"has-text-align-right\" data-align=\"right\">MariaDB 10.11<\/th><th class=\"has-text-align-right\" data-align=\"right\">Result<\/th><\/tr><\/thead><tbody><tr><td>Primary-key lookup<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.06748 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.06864 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">MemCP 1.7% faster<\/td><\/tr><tr><td><code>ORDER BY post_title LIMIT 5<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\">0.15829 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.44767 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">MemCP 15.46x faster<\/td><\/tr><tr><td>Filtered posts\/metadata join with&nbsp;<code>ORDER BY ... LIMIT 20<\/code><\/td><td class=\"has-text-align-right\" data-align=\"right\">0.24977 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">0.26430 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">MemCP 5.8% faster<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The comparison used the same data distribution, 500 warm-up requests, and seven measured blocks of 5,000 serial requests per query. These numbers are deliberately end-to-end protocol measurements rather than isolated storage calls.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first real-world beta integration provides the other side of the picture: approximately 855,000 central records, generated SQL, nested permission rules, counts, pagination, direct-column search, and file-content search. Interactions that once took minutes are now generally interactive after warm-up. On representative search workloads, MemCP has measured up to 30x faster than PostgreSQL. This is not a promise that every query will be 30x faster; it demonstrates that MemCP&#8217;s automatic indexes, candidate sets, and compiled permission paths can produce a decisive gain on an application that was not designed around MemCP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A final pre-release run on the current 0.9 code measured the database execution time of application-generated queries immediately after a process restart and again after their indexes, group caches, and query plans were warm:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Real application query<\/th><th class=\"has-text-align-right\" data-align=\"right\">PostgreSQL<\/th><th class=\"has-text-align-right\" data-align=\"right\">First run<\/th><th class=\"has-text-align-right\" data-align=\"right\">Warm runs<\/th><\/tr><\/thead><tbody><tr><td>Full 855,000-row document view, ordered page of 72 rows<\/td><td class=\"has-text-align-right\" data-align=\"right\">10 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.47 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">87\u2013119 ms<\/td><\/tr><tr><td>Exact count accompanying the full document view<\/td><td class=\"has-text-align-right\" data-align=\"right\">10 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.77 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">381\u2013402 ms<\/td><\/tr><tr><td>Permission- and tenant-filtered document page<\/td><td class=\"has-text-align-right\" data-align=\"right\">3 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">872 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">145\u2013253 ms<\/td><\/tr><tr><td>Direct-column inventory search page<\/td><td class=\"has-text-align-right\" data-align=\"right\">4 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.61 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.26\u20131.30 s<\/td><\/tr><tr><td>Exact count accompanying the inventory search<\/td><td class=\"has-text-align-right\" data-align=\"right\">10 s+<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.27 s<\/td><td class=\"has-text-align-right\" data-align=\"right\">1.61\u20131.67 s<\/td><\/tr><tr><td>Time-filtered notification\/reminder page<\/td><td class=\"has-text-align-right\" data-align=\"right\">200 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">551 ms<\/td><td class=\"has-text-align-right\" data-align=\"right\">2.62\u20133.07 ms<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">These are TracePrint database times rather than browser timings, and list and count requests run independently in the application. The distinction matters: a count can continue in parallel without delaying delivery of the first result page. It also makes cold behavior visible instead of reporting only a best cached number.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The latest execution-path fusion improved more than the headline scans. Across the same interaction trace, the median repeated permission probe fell by 8.6%, session lookup by 15.2%, and user\/permission setup by 5.9%. A generated page performs many of these small operations, so reducing their fixed overhead is directly visible in navigation latency.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The important release result is not one winning number. It is that point lookups, ordered pages, joins, broad aggregations, and complex searches can now compete inside one physical planner instead of requiring separate transactional and analytical databases.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Import, Package, Observe, and Operate<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP 0.9 is distributed as more than a source checkout:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Debian and RPM packages with systemd integration<\/li>\n\n\n\n<li>release binaries and checksums<\/li>\n\n\n\n<li>a multi-architecture container image<\/li>\n\n\n\n<li>explicit initialization and secure first-start password handling<\/li>\n\n\n\n<li>configuration files suitable for service deployment<\/li>\n\n\n\n<li>MySQL dump round-trip support<\/li>\n\n\n\n<li>PostgreSQL dump import, including\u00a0<code>COPY<\/code>, schemas, sequences, and common dump DDL<\/li>\n\n\n\n<li>CSV and JSON bulk loading<\/li>\n\n\n\n<li>local filesystem, S3-compatible, and Ceph\/RADOS persistence backends<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The web dashboard shows databases, tables, columns, shards, compression, memory ownership, active connections, errors, and running queries. Operators can inspect settings and cancel stuck work.&nbsp;<code>SHOW FULL PROCESSLIST<\/code>&nbsp;reports the active SQL text, while persistent error-query logging keeps failure context available after the request ends.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Planning is observable as well.&nbsp;<code>EXPLAIN<\/code>,&nbsp;<code>EXPLAIN IR<\/code>,&nbsp;<code>EXPLAIN REORDER<\/code>, and&nbsp;<code>EXPLAIN PHYSICAL<\/code>&nbsp;expose the generated Scheme program, logical graph, join-order decision, and physical alternatives. Trace output is complete by default; administrators may configure an explicit visible truncation limit when logs must be bounded.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What Changed Since the August Engineering Update<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The August report concentrated on the long path from multi-minute correlated queries to interactive execution. The final work for 0.9 broadened and hardened the whole system around that result.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Physical Planner Became a Shared Decision Layer<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ordered join scans, projected candidate carriers, adaptive RecSet boundaries, batch-local predicates, range braking, and low-cardinality grouped joins now enter the same costed search space. Compiler invariants explicitly prohibit physical artifacts from leaking into the logical phase. This makes new operators available to arbitrary compatible SQL shapes instead of adding another query-specific lowering branch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The cost model is generated from measured primitives and exercised by a calibration suite. CI compares branches with master across point, ordered, joined, grouped, correlated, and long-running workloads, rejecting a local optimization when it causes an unacceptable regression elsewhere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Execution Path Became Cheaper<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Scan analysis and setup were reorganized around reusable scratch storage. Common filter\/map\/reduce callbacks avoid per-row allocations. The scan family now recognizes common callback shapes and fuses mapping with reduction, removing an interpreter boundary and intermediate value construction from the inner loop while retaining the general callback path for complex expressions. Planner list pipelines, range consumers, unique collectors, and grouped reductions likewise fuse rather than construct intermediate lists. MySQL result rows stream directly into protocol packets instead of first becoming a second row representation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Query execution context is now explicit. Removing goroutine-local transaction state made cancellation, query reporting, authentication scans, nested execution, and future compilation easier to reason about. Query plans are cached as explicit callables that can use the interpreter today and the experimental JIT when that backend is enabled.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compatibility and Failure Handling Were Tested as Workflows<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The suite now includes application-shaped notifications, schema checks, generated permission trees, page selection, deletion, ID-list workflows, dump recovery, concurrent rebuilds, cancellation, package lifecycle, and process reporting. These tests do more than check parser acceptance: they execute the sequence in which an application relies on the feature.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The test infrastructure itself gained SQL time-limit guards, plan-shape assertions, master-versus-branch performance checks, crash\/restart fixtures, and packaging validation. The goal is to turn failures found during beta use into permanent anonymous regressions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why 0.9 Is a Beta<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP 0.9 is suitable for serious evaluation and controlled beta deployments, but the version number is intentional.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SQL is a large language. Complex application suites should still be tested against their exact generated statements before cutover.<\/li>\n\n\n\n<li>The first production-style deployment is in beta validation; sustained concurrency, unusual session behavior, and long-term recovery remain active test areas.<\/li>\n\n\n\n<li>Cost estimates continue to improve as the calibration workload expands across data sizes and selectivities.<\/li>\n\n\n\n<li>PostgreSQL compatibility is currently a SQL dialect and import path over HTTP, not a drop-in PostgreSQL wire server.<\/li>\n\n\n\n<li>Foreign keys are accepted as metadata but are not generally enforced as relational constraints.<\/li>\n\n\n\n<li>The amd64 JIT remains experimental and requires a patched Go toolchain. Normal builds use the fully supported interpreter path.<\/li>\n\n\n\n<li>Remote object-storage configurations need the same operational testing and backup discipline as any other database deployment.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For important data, use the default&nbsp;<code>safe<\/code>&nbsp;engine, keep tested backups, validate restore procedures, and compare application results during migration. Beta means we want real workloads and feedback; it does not mean weakening the durability contract.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A Database That Learns the Workload<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP&#8217;s defining idea is now visible across the complete system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Columns choose compact encodings from their values. Shards rebuild and repartition as data changes. Indexes emerge from query boundaries. Computed columns and grouped results retain repeated work. RecSets change representation with density. Ordered scans adapt between index-driven and candidate-driven traversal. Cached plans carry guards for the assumptions that made them cheap.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Applications continue to express what they need in SQL. MemCP decides how to store, restrict, order, reuse, and execute that work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Version 0.9 is the first beta release where all of those layers operate together: a persistent main-memory storage engine, a general decorrelating query compiler, adaptive physical operators, familiar database interfaces, operational tooling, and deployment artifacts. The next phase is no longer proving that the architecture can execute a real application. It is running more of them, closing the remaining compatibility gaps, and turning beta evidence into a stable 1.0 contract.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Get Started<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Project and source code: https:\/\/github.com\/launix-de\/memcp<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Previous report: https:\/\/launix.de\/launix\/memcp-engineering-update-mar-9-aug-26-2026\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MemCP 0.9 is open source under the GNU General Public License v3 or later. We welcome application compatibility reports, reproducible query shapes, performance comparisons, and operational feedback from beta users.<\/p>","protected":false},"excerpt":{"rendered":"<p>Today we are releasing MemCP 0.9 as a public beta. MemCP is a persistent main-memory database designed to run existing SQL applications without giving up the advantages of a compact, column-oriented engine. Applications can connect through the MySQL protocol, send MySQL- or PostgreSQL-style SQL over HTTP, use the built-in REST router, or query RDF data&#8230;<\/p>","protected":false},"author":2,"featured_media":4842,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","footnotes":""},"categories":[129,128],"tags":[],"class_list":["post-8216","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-memcp","category-programming","single-item"],"featured_image_urls_v2":{"full":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"thumbnail":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-150x150.png",150,150,true],"medium":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"medium_large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"1536x1536":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"2048x2048":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"trp-custom-language-flag":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",14,12,false],"xs-thumb":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-64x64.png",64,64,true],"appku-shop-single":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false]},"post_excerpt_stackable_v2":"<p>Today we are releasing MemCP 0.9 as a public beta. MemCP is a persistent main-memory database designed to run existing SQL applications without giving up the advantages of a compact, column-oriented engine. Applications can connect through the MySQL protocol, send MySQL- or PostgreSQL-style SQL over HTTP, use the built-in REST router, or query RDF data with SPARQL. Data remains durable on disk while frequently used columns, indexes, and intermediate results stay close to the CPU. The 0.9 release marks a change in what MemCP is ready to do. The first public release demonstrated the storage model and broad SQL support.&hellip;<\/p>\n","category_list_v2":"<a href=\"https:\/\/launix.de\/launix\/en\/category\/memcp\/\" rel=\"category tag\">MemCP<\/a>, <a href=\"https:\/\/launix.de\/launix\/en\/category\/programming\/\" rel=\"category tag\">Programming<\/a>","author_info_v2":{"name":"Carl-Philip H\u00e4nsch","url":"https:\/\/launix.de\/launix\/en\/author\/carli\/"},"comments_num_v2":"0 comments","uagb_featured_image_src":{"full":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"thumbnail":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-150x150.png",150,150,true],"medium":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"medium_large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"large":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"1536x1536":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"2048x2048":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false],"trp-custom-language-flag":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",14,12,false],"xs-thumb":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo-64x64.png",64,64,true],"appku-shop-single":["https:\/\/launix.de\/launix\/wp-content\/uploads\/2023\/01\/memcp-logo.png",256,216,false]},"uagb_author_info":{"display_name":"Carl-Philip H\u00e4nsch","author_link":"https:\/\/launix.de\/launix\/en\/author\/carli\/"},"uagb_comment_info":0,"uagb_excerpt":"Today we are releasing MemCP 0.9 as a public beta. MemCP is a persistent main-memory database designed to run existing SQL applications without giving up the advantages of a compact, column-oriented engine. Applications can connect through the MySQL protocol, send MySQL- or PostgreSQL-style SQL over HTTP, use the built-in REST router, or query RDF data...","_links":{"self":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8216","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/comments?post=8216"}],"version-history":[{"count":1,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8216\/revisions"}],"predecessor-version":[{"id":8217,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/posts\/8216\/revisions\/8217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/media\/4842"}],"wp:attachment":[{"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/media?parent=8216"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/categories?post=8216"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/launix.de\/launix\/en\/wp-json\/wp\/v2\/tags?post=8216"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}