This post is maintained by Bytebase, an open-source database governance platform that can manage both MySQL and SQL Server. We update the post every year.
Both databases shipped their biggest release in years within a few months of each other: SQL Server 2025 went GA in November 2025, the first major version since 2022, and MySQL 9.7 LTS landed in April 2026, the first LTS since 8.4. Meanwhile MySQL 8.0, still the most-deployed version in the wild, hit end of life in April 2026, so a lot of teams are re-evaluating right now.
The interesting pattern in these releases: both vendors moved features down-market. Microsoft raised Express's database cap to 50 GB and Standard's limits to 32 cores / 256 GB, continuing the trajectory it set in 2016 when the programmability and security surface went into every edition. Oracle pushed its new optimizer and Group Replication observability into free Community. Where each vendor chose to keep charging tells you what they think their moat is, and it reshapes the comparison below.
At a Glance
Comparison is MySQL 9.7 LTS vs SQL Server 2025 (17.x) unless noted.
| Dimension | MySQL 9.7 | SQL Server 2025 |
|---|---|---|
| License model | GPL Community (free) + per-server subscription | Commercial: per-core, or server + CAL |
| Free tier | Full engine, no resource limits | Express: 4 cores, 1.4 GB buffer pool, 50 GB/database |
| Platforms | Linux, Windows, macOS | Windows, Linux, containers |
| Default concurrency | MVCC (InnoDB, REPEATABLE READ) | Lock-based READ COMMITTED; snapshot isolation opt-in |
| Online DDL | INSTANT/INPLACE algorithms in free Community | Online index create/rebuild is Enterprise-only |
| Built-in HA | Group Replication in Community | Always On availability groups Enterprise; 2-node basic AG in Standard |
| Columnstore | Not in core (HeatWave, cloud only) | All editions |
| JSON | Native type since 5.7; read/write duality views in 9.7 | Native json type new in 2025 |
| Vector search | VECTOR type, no ANN index in core | Vector type + DiskANN index, all editions |
| Procedural depth | Basic stored procedures | Deep T-SQL, CLR, external language runtimes |
| Flagship tooling | MySQL Shell, Workbench, performance_schema | SSMS, Query Store (on by default since 2022) |
The License Math Decides Most Evaluations
The structural difference matters more than any single price: MySQL charges per server, SQL Server charges per core. One scales with how many boxes you run, the other with how big each box is.
List prices, from Oracle's MySQL global price list (September 2025) and Microsoft's published SQL Server 2025 licensing:
| Product | List price |
|---|---|
| MySQL Community | $0 |
| MySQL Standard Edition | $2,140 per server per year (1-4 sockets) |
| MySQL Enterprise Edition | $5,350 per server per year (1-4 sockets) |
| SQL Server Express / Developer | $0 |
| SQL Server Standard (server + CAL) | $989 per server + $230 per CAL |
| SQL Server Standard (per core) | $3,945 per 2-core pack, 4-core minimum |
| SQL Server Enterprise (per core) | ~$7,562 per core ($15,123 per 2-core pack) |
Now run it on real hardware. A 32-core production server:
- MySQL Enterprise: $5,350 per year. Core count is irrelevant; the tier is by socket.
- SQL Server Enterprise: 16 packs × $15,123 = $241,968 perpetual, plus ~25% annually for Software Assurance if you want upgrade rights, failover benefits, and Azure Hybrid Benefit.
Annualize the perpetual license over five years with Software Assurance and the gap is still roughly 20x, which is why "we're migrating off SQL Server" projects exist. But run the math at the low end and the story flips politely: SQL Server Standard on a 4-core VM is $7,890 one-time, which over five years is cheaper than five years of MySQL Enterprise subscription. SQL Server is not expensive; SQL Server Enterprise on big iron is expensive.
Two more numbers worth knowing before a negotiation:
- Express got 5x bigger. SQL Server 2025 raised the Express database cap from 10 GB to 50 GB and folded in the formerly separate Advanced Services features (full-text search, ML integration). The free tier now genuinely covers small internal apps, which it never did before.
- MySQL Community is not a trial. It is the full engine: no size cap, no core cap, InnoDB, replication, Group Replication. What Enterprise adds is the ops/compliance layer: audit, TDE key management, firewall, and (new in 9.7) Dynamic Data Masking, plus Oracle support.
On the cloud side (RDS, Cloud SQL, Azure SQL), the same structure carries over: SQL Server "License Included" instances bake the per-core license into the hourly rate, so a like-for-like instance typically runs 2-4x the MySQL equivalent, and BYOL via Azure Hybrid Benefit is how Microsoft shops claw that back. Exact rates move too often to print; use the providers' calculators, not a blog table.
Concurrency: The Day-One Surprise
This is the difference that bites first when teams migrate in either direction.
InnoDB is MVCC throughout: readers never block writers and writers never block readers, at every isolation level, with old row versions kept in the undo log. It has worked this way for twenty years and MySQL developers take it for granted.
SQL Server's default READ COMMITTED is lock-based. A reader takes shared locks; a writer holding an exclusive lock blocks that reader until commit. This is why WITH (NOLOCK) hints are scattered through legacy T-SQL codebases, a folk remedy that trades blocking for reading uncommitted garbage. The proper fix, Read Committed Snapshot Isolation (RCSI), gives Postgres/MySQL-style non-blocking reads from a tempdb version store, but it is opt-in on self-hosted SQL Server (Azure SQL Database enables it by default), and it changes application-visible semantics, so turning it on for a legacy app is a project, not a flag flip. SQL Server 2025's optimized locking (available in Standard and Enterprise) shrinks lock memory and lock escalation pain, but the default read behavior still surprises every MySQL developer the first time a SELECT hangs behind an open transaction.
Direction matters for planning: MySQL → SQL Server migrations discover blocking; SQL Server → MySQL migrations discover that REPEATABLE READ gap-locking deadlocks look nothing like the lock waits they knew. Neither is wrong. They are different defaults chosen decades ago, and application code grows around them.
Online Operations: Check the Edition Column
MySQL's schema-change story is one of its quiet strengths: ALTER TABLE ... ALGORITHM=INSTANT adds a column in milliseconds regardless of table size, INPLACE builds most indexes online, and all of it ships in free Community. The ecosystem (gh-ost, pt-online-schema-change, spirit) covers the cases the engine doesn't.
On SQL Server, look closely at the edition feature matrix: online index create and rebuild, resumable index operations, and online schema change are Enterprise-only. On Standard, rebuilding a large index takes the table offline for the duration. Teams on Standard live with maintenance windows that MySQL Community users simply don't schedule.
If your application changes schema continuously (SaaS, weekly releases), this line item alone can decide the comparison, or force the Enterprise SKU and change the math above.
Query Processing: Depth vs. Access
SQL Server's optimizer is the more sophisticated of the two, and it isn't close. Intelligent Query Processing (adaptive joins, memory grant feedback, cardinality estimation feedback, parameter-sensitive plan optimization) plus Query Store for plan history and plan forcing make it the best self-diagnosing engine in the mainstream market. The caveat, again, is the edition column: the marquee IQP features are Enterprise-only, while Query Store and parameter-sensitive plans are everywhere.
MySQL's classical optimizer is a left-deep, greedy enumerator that plans fast and does fine on OLTP, and falls over on deep analytical joins. The news in 9.7: the hypergraph optimizer, a cost-based rewrite that considers bushy plans, moved from Enterprise into Community. It is off by default and statistics-sensitive (on Oracle's published TPC-DS runs, 19 queries improved ≥50% while 14 regressed ≥50%), so treat it as a per-statement scalpel via SET_VAR, not a global switch.
For analytics proper: SQL Server ships columnstore indexes in every edition (batch-mode parallelism is capped at DOP 2 on Standard), so mixed OLTP + reporting on one box is a solved problem. MySQL has no columnstore in core; Oracle's answer is HeatWave, which is real but cloud-only. Self-hosted MySQL teams export to ClickHouse or a warehouse instead.
High Availability
MySQL Group Replication is a quorum-based, automatic-failover cluster that ships in the server, in Community, with MySQL Router completing the stack. 9.7 moved the observability components (applier metrics, flow-control statistics, automatic eviction, smarter primary election) from Enterprise to Community, which fixes the old complaint that you could run GR for free but not debug it for free.
SQL Server's Always On availability groups are mature and battle-tested, with up to 8 secondaries and readable replicas, but they are Enterprise-only. Standard gets basic availability groups: two replicas, one database per group, no readable secondary. Failover Cluster Instances work on Standard (2 nodes) with shared storage.
The honest summary: both platforms have production-grade HA; on MySQL it's free, on SQL Server the version people actually mean when they say "Always On" costs $7,562 per core.
Security: Free on One Side, Paid on the Other
The old version of this section wrote itself: SQL Server had the enterprise security stack, MySQL charged for its equivalent. What most people missed is that Microsoft already inverted the pricing half of that sentence back in SQL Server 2016 SP1, when Always Encrypted, Dynamic Data Masking, and Row-Level Security went into every edition, including free Express. SQL Server 2025 keeps extending the free surface (ledger tables, database audit, Always Encrypted enclaves in all editions), with TDE as the notable holdout: it reaches Standard but still not Express.
MySQL kept the opposite structure: encryption key management, audit log, database firewall, and the new first-class Dynamic Data Masking (9.7) all live in the paid Enterprise Edition. Community users assemble equivalents from the ecosystem: keyring_file variants, ProxySQL query rules, or an external governance layer.
So the standing state, nearly a decade old and still under-internalized: on security features, the free tier of the commercial database is more generous than the free tier of the open-source one.
Bytebase adds a shared governance layer over both engines: approval workflows, SQL review, audit trail, and dynamic data masking for human queries through its SQL Editor, which is how teams get masking on MySQL Community without an Enterprise subscription.
Developer Experience
Procedural code. T-SQL is a real programming environment: rich control flow, error handling, CLR integration, external language runtimes (Python/R/Java), and in 2025, native regular expressions and a native json type with JSON indexes. MySQL's stored procedures remain the weakest part of the product, fine for a trigger or a small routine, painful beyond that. Logic-heavy-in-the-database applications strongly favor SQL Server; teams that keep logic in the application won't notice.
JSON. MySQL has had a native binary JSON type, functions, and generated-column indexing since 5.7 (2015), and 9.7's JSON duality views let an app read and write JSON documents over normalized rows. SQL Server stored JSON as nvarchar with functions for a decade; 2025 finally ships a native type. MySQL is a generation ahead in maturity here; SQL Server has closed the gap on paper.
AI/vector. SQL Server 2025 leads: a native vector type plus DiskANN approximate-nearest-neighbor indexing in all editions, aimed squarely at RAG workloads next to transactional data. MySQL's VECTOR type (9.0) is storage and distance functions without an ANN index in core; the indexed vector story is HeatWave, cloud only.
Ecosystem. MySQL is the default database of the open-source web: every framework, ORM, tutorial, and hosting panel supports it first, DBA talent is abundant, and Stack Overflow answers exist for every error message. SQL Server's ecosystem is narrower but deeper: SSMS is arguably the best database GUI ever shipped, and the integration story inside a Microsoft estate (.NET, Entra ID auth, Power BI, Fabric mirroring) is something MySQL can't match.
Which One, Then
Choose MySQL when:
- You're building for the web on Linux. OLTP-shaped workloads, horizontal read scaling, container fleets. This is MySQL's home turf and the entire ecosystem assumes it.
- License cost scales with your hardware. Many servers or big servers: per-server (or free) beats per-core, and it isn't a rounding error at 32+ cores.
- You need online schema changes without an Enterprise SKU. Instant/online DDL in the free edition is a workflow, not a feature.
- Multi-cloud or cloud-portability is a requirement. Every provider runs managed MySQL; nobody's procurement leverage depends on it.
Choose SQL Server when:
- You're a Microsoft shop. .NET, Windows auth/Entra ID, Power BI, Azure. The integration dividend is real and compounds.
- OLTP and analytics share a box. Columnstore in every edition plus the strongest optimizer in the segment; MySQL simply doesn't play this game in core.
- Business logic lives in the database. T-SQL, CLR, and the tooling around them are a different league than MySQL stored procedures.
- You want the security stack without a subscription. Always Encrypted, DDM, and RLS ship in every edition since 2016 SP1 (TDE needs Standard), while the MySQL equivalents are Enterprise-only.
- The workload fits Standard or Express. At 4-16 cores on Standard, or under Express's new 50 GB cap, SQL Server's price objection mostly evaporates.
The gravitational pull in practice: greenfield web products default to MySQL or Postgres and rarely regret it; organizations already carrying a Microsoft estate default to SQL Server and rarely regret it either. The expensive mistakes happen in the middle, when a team picks SQL Server Enterprise for a workload that needed neither the optimizer nor Always On, or picks MySQL for an analytics-heavy internal platform and ends up bolting on a warehouse in year two.
FAQ
What is the difference between SQL and MySQL?
SQL is the query language standard. MySQL is a database system that speaks it; SQL Server is Microsoft's database system that speaks its own dialect, T-SQL. The naming is unfortunate and permanent.
Is MySQL free for production use?
Yes. MySQL Community Edition is GPL-licensed, full-featured, and has no size or core limits. Paid Standard ($2,140/server/year) and Enterprise ($5,350/server/year) subscriptions add audit, TDE key management, masking, and Oracle support.
Can SQL Server Express run a production app?
More plausibly than before. SQL Server 2025 raised Express's cap to 50 GB per database and included the full security feature set, but the 4-core / 1.4 GB buffer pool ceiling remains. Small internal tools: yes. Anything with growth expectations: budget for Standard.
Can I migrate from MySQL to SQL Server (or back)?
Microsoft's SQL Server Migration Assistant handles MySQL → SQL Server schema and data conversion. Going the other way there is no single official tool; teams script it or use commercial ETL. In both directions the schema is the easy part; stored procedures and the concurrency-model assumptions baked into application code are where the effort goes.
References
- SQL Server 2025 editions and supported features
- SQL Server 2025 pricing
- Oracle MySQL global price list (PDF)
- MySQL 9.7 release notes
- Notes on the MySQL 9.7 LTS release
- Postgres vs. SQL Server