mysql和oracle的区别
添加列
oracle
ALTER TABLE 表名 ADD 列名 字段类型 DEFAULT 默认值;
--新增
comment on column 表名.列名 is '注释';
mysql
ALTER TABLE 表名 ADD 列名 字段类型 默认值 comment '';
定长/变长字符串
oracle
char是固定长度,varchar2是可变长度
mysql
char是固定长度,varchar是可变长度
Alter Table时的性能优化区别
oracle
oracle数据库中的ONLINE关键字在ALTER TABLE命令中的作用是允许在修改表结构时,表仍然可以被查询和更新。这是Oracle数据库为了提高可用性和减少停机时间而引入的一个特性,尤其是在大型生产环境中,停机时间成本非常高。
当你使用ONLINE关键字进行表结构的更改时,如添加、删除或修改列,Oracle会在后台创建一个新的表结构,并在更改完成后将表的数据无缝地迁移到新结构上。在此期间,原有的表结构仍然可供应用程序使用,从而避免了修改期间的中断。
例如,要在线添加一个列,你可以使用如下命令:
ALTER TABLE your_table ADD (new_column VARCHAR2(50)) ONLINE;
mysql
MySQL在InnoDB存储引擎中通过使用行级锁和多版本并发控制(MVCC)机制来保证在执行ALTER TABLE操作时,表仍然可以进行查询和更新操作。然而,对于在线DDL操作,MySQL的实现方式在不同的版本中有所不同:
MySQL 5.6 及之前版本
在MySQL 5.6及之前的版本中,InnoDB存储引擎并没有原生支持在线DDL操作。这意味着在执行ALTER TABLE时,表会被锁定,直到操作完成,这可能会影响读写性能,尤其是在大型表上。
MySQL 5.7 及更高版本
从MySQL 5.7开始,InnoDB存储引擎引入了原生的在线DDL支持,这使得在执行表结构变更时,可以减少或消除对表的锁定,从而允许查询和更新操作继续进行。以下是InnoDB如何实现这一功能的一些关键点:
- Row-Mapping: 当执行如添加或删除列等操作时,InnoDB会创建一个新的表结构,并在后台将旧表的数据逐步迁移到新表中。在此期间,InnoDB使用行映射(row-mapping)技术来确保旧表和新表之间的一致性。这意味着,尽管物理上数据正在迁移,但逻辑上对应用程序而言,表的结构没有变化。
- Incremental Renaming: 一旦数据迁移完成,InnoDB会原子地将新表替换为旧表,这一过程称为增量重命名(incremental renaming)。这意味着在某一时刻,所有新插入的数据都会进入新表,而旧表的数据会逐渐被清理掉。
- Read-View and MVCC: InnoDB的多版本并发控制(MVCC)机制确保了在数据迁移过程中,事务可以看到它们开始时的数据视图。这意味着即使数据正在迁移,读取操作也不会被阻塞,因为InnoDB可以返回适当版本的数据给事务。
- Row-Level Locking: InnoDB使用行级锁来管理并发操作,这意味着在执行DDL操作时,只有受影响的行会被锁定,而不是整个表。这有助于减少锁的竞争,从而提高并发性能。
本文来自博客园,作者:梦回大唐meng,转载请注明原文链接:https://www.cnblogs.com/BitX/p/18295790
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!