特性 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
默认索引 | B-tree + 位图索引(OLAP场景) | B-tree(可扩展插件式架构) | B+Tree(InnoDB) |
高级索引 | 反向键索引(分散热点)、函数索引 | GiST(地理空间)、GIN(全文/JSON) | 全文索引(倒排)、空间索引(需GIS插件) |
覆盖索引 | 自动覆盖查询字段 | 需显式包含查询字段 | 仅当索引包含所有字段时生效 |
部分索引 | 不支持 | WHERE status='active' | 不支持 |
索引组织表 | IOT表(主键即数据存储顺序) | 堆表存储 | InnoDB默认(主键聚簇) |
关键差异解读:
Oracle:
(it咸鱼)-- 反向键索引分散插入热点
CREATE INDEX idx_orders_id_reverse ON orders(id) REVERSE;
-- 位图索引优化状态查询
CREATE BITMAP INDEX idx_order_status ON orders(status);
PostgreSQL:
-- 部分索引减少存储
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;
-- JSONB路径查询优化
CREATE INDEX idx_profile_gin ON users USING GIN (profile_jsonb);
MySQL:
-- 覆盖索引避免回表
ALTER TABLE orders ADD INDEX idx_cover (user_id, amount, create_time);
-- 全文索引加速搜索
CREATE FULLTEXT INDEX idx_content ON articles(content);
特性 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
行级锁 | ✅ 自动通过UNDO段管理 | ✅ MVCC无锁读 + 行级排他锁 | ✅ InnoDB支持(若无索引退化为表锁) |
表级锁 | ✅ DDL操作自动加锁 | ✅ LOCK TABLE显式控制 | ✅ MyISAM仅表锁 |
死锁检测 | ✅ 自动检测并回滚代价最小的事务 | ✅ 等待图算法(pg_stat_activity) | ✅ 自动检测(innodb_deadlock_detect) |
锁升级 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
关键差异解读:
VACUUM
清理旧版本。Oracle:
(it咸鱼)-- 监控锁等待
SELECT * FROM v$lock WHERE block = 1;
-- 增加INITRANS减少ITL争用
ALTER TABLE orders INITRANS 10;
PostgreSQL:
(it咸鱼)-- 查看阻塞会话
SELECT * FROM pg_stat_activity WHERE wait_event_type = 'Lock';
-- 终止长时间空闲事务
SET idle_in_transaction_session_timeout = '5min';
MySQL:
(it咸鱼)-- 查看锁等待
SHOW ENGINE INNODB STATUS\G
-- 降低隔离级别减少间隙锁
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
特性 | Oracle | PostgreSQL | MySQL |
---|---|---|---|
多版本存储 | UNDO段 + 数据块头部事务槽(ITL) | Heap表存储所有版本(xmin/xmax) | UNDO日志 + 行头事务ID |
可见性判断 | 基于SCN的快照(读一致性) | 事务快照(Snapshot Isolation) | Read View(RR级别) |
旧版本清理 | 自动UNDO回收(SMON进程) | 需手动/自动VACUUM | Purge线程异步清理 |
幻读处理 | ❌ RR级别存在幻读 | ✅ SSI(可串行化快照隔离) | ✅ 间隙锁防止幻读 |
关键差异解读:
Oracle:
(it咸鱼)-- 使用哈希分区分散热点
CREATE TABLE orders (...) PARTITION BY HASH(user_id) PARTITIONS 16;
-- 反向键索引分散插入压力
PostgreSQL:
-- 增加fillfactor减少页分裂
CREATE TABLE logs (id SERIAL, data TEXT) WITH (fillfactor=70);
-- 使用BRIN索引优化时间序列
MySQL:
(it咸鱼)-- 自增主键交错锁模式
SET GLOBAL innodb_autoinc_lock_mode = 2;
-- 分区表分散写入压力
ALTER TABLE orders PARTITION BY RANGE (YEAR(create_time)) (...);
延展问题:
INITRANS
,监控enq: TX - allocate ITL entry
等待事件。扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有