InnoDB vs MyISAM
Also Known As
InnoDB
MyISAM
MySQL storage engine
InnoDB vs MyISAM
TL;DR
InnoDB is the default MySQL storage engine supporting transactions, foreign keys, and row-level locking — MyISAM is legacy with table-level locking and no transaction support.
Explanation
InnoDB has been MySQL's default since 5.5. It supports ACID transactions, row-level locking (better concurrency), foreign key constraints, crash recovery, and MVCC. MyISAM offers faster full-table reads and has slightly smaller on-disk storage but lacks transactions, crashes inconsistently, and uses table-level locking that serialises all writes. New tables should always use InnoDB. MyISAM FULLTEXT search support has been superseded by InnoDB FULLTEXT (available since MySQL 5.6).
Common Misconception
✗ MyISAM is faster than InnoDB. For typical OLTP workloads with concurrent reads and writes, InnoDB is faster due to row-level locking. MyISAM's speed advantage was real in MySQL 4.x era.
Why It Matters
Using MyISAM means no transactions — data corruption from partial writes is possible on server crash. Row-level locking in InnoDB allows many concurrent writers; MyISAM's table lock makes a single write block all other writes.
Common Mistakes
- Creating tables without ENGINE=InnoDB on older MySQL installations that default to MyISAM.
- Using MyISAM tables in a schema that relies on foreign keys — MyISAM silently ignores FK constraints.
- Not converting existing MyISAM tables when adding transactions to an application.
Avoid When
- Never use MyISAM for tables that participate in transactions or have foreign key constraints.
- Do not use MyISAM for any table that receives concurrent writes — table-level locking serialises all writes.
When To Use
- Always use InnoDB — it is the default and correct choice for all new tables.
- Migrate existing MyISAM tables to InnoDB with ALTER TABLE ... ENGINE=InnoDB.
Code Examples
✗ Vulnerable
-- MyISAM: no transactions, no FK, table-level lock
CREATE TABLE orders (...) ENGINE=MyISAM;
✓ Fixed
-- Always explicit ENGINE=InnoDB
CREATE TABLE orders (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
total DECIMAL(10,2) NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Tags
🤝 Adopt this term
£79/year · your link shown here
Added
31 Mar 2026
Views
22
🤖 AI Guestbook educational data only
|
|
Last 30 days
Agents 1
No pings yesterday
Google 7
SEMrush 3
Unknown AI 2
ChatGPT 2
Perplexity 1
Ahrefs 1
Also referenced
How they use it
crawler 15
crawler_json 1
Related categories
⚡
DEV INTEL
Tools & Severity
⚙ Fix effort: Low
⚡ Quick Fix
Always specify ENGINE=InnoDB in CREATE TABLE — or set innodb as the default_storage_engine in MySQL config
📦 Applies To
web
cli
🔗 Prerequisites
🔍 Detection Hints
ENGINE=MyISAM in CREATE TABLE or SHOW TABLE STATUS
Auto-detectable:
✓ Yes
semgrep
⚠ Related Problems
🤖 AI Agent
Confidence: High
False Positives: Low
✓ Auto-fixable
Fix: Low
Context: Line