mysql和oracle的区别
- 格式:doc
- 大小:36.00 KB
- 文档页数:5
oracle学习笔记-mysql与oracle语法区别区别(转:)1、if else分⽀mysql:⽤elseif Oracle:⽤elsif可以⽤select直接查看获取的值或者⼀个变量。
1 create procedure pd_testif2(in num int,out str varchar)2 begin3 if num=1 then4 set str='⼀';5 elseif num=2 then6 set str='⼆';7 end if;8 end;9 --调⽤10 call pd_testif2(1,@str);11 select @str;执⾏结果:⼀2、循环mysql:while 条件 do Oracle:while 条件 loop语句块语句块end while; end loop;1 create procedure pd_testwhile22(in num int,out sum int)2 begin3 --定义变量4 declare i int default 1;5 declare sum int default 0;6 --循环条件7 while i<num do8 set vsum=vsum+i;9 set i=i+1;10 --结束循环11 end while;12 set sum=vsum;13 end;14 call pd_testwhile22(100,@str);15 select @str;执⾏结果:5050补充:Oracle和MySQL的⼀点区别:函数、⽇期、limit关键字区别(转不同点:1. mysql: IFNULL(a,b)oracle: NULLIF(a,b)2. mysql: 可以⽤Date类型的⽇期进⾏⽐较时间⽐较oracle:必须⽤to_date()函数和to_char()函数配合转换成统⼀格式的⽇期字符串,然后进⾏⽐较3. mysql: 可以⽤YEAR(), MONTH(), NOW()等函数获取年/⽉/当前⽇期等oracle:必须⽤to_char(sysdate, 'yyyy'),to_char(sysdate, 'MM')获取4. mysql: 字符串识别"",''oracle:字符串只识别''5. mysql: 可以⽤limit关键字截取所需的数据⾏oracle:必须⽤rownum关键字通过⼦查询来截取所需数据⾏表、列、索引、空字符串---转()2.1 创建表(同)create table tableName(columnName1 int,columnName2 int)2.2 删除表(异)MySQL:drop table if exists tableNameOracle:drop table tableName注:Oracle没有if exists关键字,也没⽤类似if exists的SQL语法。
数据库管理系统比较MySQLvsOraclevsSQLServer 数据库管理系统比较:MySQL vs Oracle vs SQL Server引言:数据库管理系统是现代信息技术领域中不可或缺的一环。
随着数据量的急剧增加和数据库应用的广泛应用,选择适合自己需求的数据库管理系统变得至关重要。
在本文中,我们将比较三种常见的数据库管理系统:MySQL、Oracle和SQL Server。
通过对比它们的性能、功能、可扩展性和使用成本,为读者提供一个更好地了解和选择的依据。
一、性能比较在数据库管理系统中,性能是一个至关重要的因素。
下面将对MySQL、Oracle和SQL Server的性能进行比较。
1.1 MySQL性能MySQL是一个轻量级的开源数据库管理系统,以其高性能而闻名。
它采用多线程处理机制和高效的索引算法,能够处理大规模的数据访问和高并发请求。
此外,MySQL还支持垂直和水平扩展,可根据实际需求进行灵活配置和调整。
因此,在对于大多数中小型应用来说,MySQL提供了相对较好的性能。
1.2 Oracle性能Oracle是一个功能强大且成熟的商业数据库管理系统。
它具有出色的性能,并且能够处理大规模的复杂数据模型。
Oracle采用了先进的事务处理机制和高效的查询优化算法,使其在处理高并发访问和复杂查询时具有出色的性能表现。
然而,Oracle的性能和功能也伴随着更高的硬件要求和许可成本。
1.3 SQL Server性能SQL Server是由微软公司开发的关系型数据库管理系统。
它在处理大规模数据时表现出色,并且支持高并发访问和复杂查询。
SQL Server 采用了先进的内存管理和缓存技术,以提高查询速度和响应时间。
此外,SQL Server还具有良好的稳定性和可靠性,适用于中小型企业的应用场景。
综合比较,MySQL适用于中小型应用,对性能要求较高且成本敏感的场景;Oracle适用于大规模企业级应用,对功能和可靠性要求较高的场景;SQL Server适用于中小型企业应用,对性能和稳定性要求较高的场景。
oracle建表与mysql建表的一些区别
oracle建表与mysql建表的一些区别
1、oracle没有bit类型,修改为varchar2(1)或者char(1)
2、oracle没有datetime类型,修改为date类型
3、view是oracle的关键字不能用来做表明
4、int类型修改为number
5、mysql可以实现自增列,只要在建表时设置auto_increment 即可,而oracle在建表时不能设置自增序列功能,必须通过sequence序列来实现自增列的功能
6、整个数据库中,mysql的索引是可以重名的,mysql索引是表级别的,但是oracle索引是不可以重名的,它的索引是数据库级别的(mysql的索引是从0开始的,oracle数据库索引是从1开始的)
7、oracle创建一个数据库相当于创建一个实例。
一个oracle可以创建很多个实例。
在实例中创建表的空间,把表空间指向数据文件。
创建用户,用户指向使用的表空间。
这个创建用户的过程就相当于mysql的creat database。
Mysql与Oracle的50个区别1. 有些人说Oracle没有限制,实际上他们说得可能是Oracle不支持LIMIT语法.不过可以rownum虚列来实现,不过会更加麻烦.2. Oracle不支持偏移(offset)语法.3. Oracle的复制功能可能比MySQL更加健壮,不过也更加难以配置.4. 对于多个Master类型的系统,大部分用户都希望你使用更加复杂也更加昂贵的Oracle RAC(虽然可能NDB更加健壮).5. Oracle的分区功能非常健壮,但是它不是内置的,并需要专门为此付费(分区功能是在Enterprise Edition里面是内置的).6. 在Linux/Unix上,Oracle并不象Mysql那么方便,很多Linux/Unix发行版默认就会自带Mysql.(我对这一点的理解与翻译可能都有偏差)7. INSERT … ON DUPLICATE KEY U PDATE语法将不再可用,不过你需要学习更加复杂(但是符合SQL标准)的MERGE语法.8. Oracle的ROLE架构与MySQL有很大差异,无法再使用root角色来完整所有工作.(不过Sys用户的权限仍然与root相差无几,只是为了安全着想,不建议这么使用了).9. Role 帐户与特定的Schema联系在一起(反之也一样),类似于MySQL数据库中的Database概念.(Role并不完全与Schema联系在一起,系统有一些固定的role,这些Role包含部分已经定义好的权限集(privilege set),也可以再自定义部分新的role).10. 事实上,丢弃一切已知的关于连接访问的设置吧,Oracle使用一套全新的系统来处理连接访问.11. 支持全文搜索,不过语法完全不同.12. Oracle的文档非常丰富,不过,如果需要Oracle的专业服务,你需要拥有Metalink的访问权限.13. 在非数据库社区很难找到相关的支持信息(例如,PHP论坛或者网站开发者的网志)14. 自增功能可以通过Trigger与sequence对象来实现.15. 大量日常熟悉的SHOW命令将不再可用,想要获取系统信息,需要你学习Oracle的数据字典(或信息Schema),深入一点的还需要学习Oracle动态性能.16. MySQL为信息Schema添加了多个非标准的扩展,在Oracle中将很难找到这些信息.17. 为了管理好生产系统与非生产系统的的转入转出,需要你深入理解Oracle的授权规则.18. 大体上讲,Oracle的数值类型更加简单,如果你确实需要类似于MySQL的多粒度的数值类型,就需要你自己来实现它,或者通过制定不同的精度(Number(n,x))来实现.19. 在Oracle中,表可以做到无限制的增长,但是大部分情况下,都建议通过表空间(tablespace)来对此作细粒度的管理.20. Oracle不支持ALTER TABLE ADD COLUMN BEFORE|AFTER,也就是不支持自己制定字段的位置.(我们这边之前有部分应用对字段顺序有严格地要求,不过,从理论上讲,这是业务设计的问题,主要是其大部分情况下都是使用select *或者insert table values来处理数据,而不是在select,insert中指定具体需要处理的字段名列表).21. 如果你习惯于通过图形界面(GUI)来管理数据库,你一定会喜欢上Oracle,但是如果你倾向于使用类似与Mysql 命令行的客户端,你可能会对sql*plus这个客户端工具感到失望(需要一个习惯的过程,sql*plus还是蛮好用的).22. Oracle的数据校验比Mysql更加严格,依赖于MySQL的模糊规则可能会导致应用无法运行.MySQL 接受”0000-00-00″来作为日期类型的值就是个典型的例子.23. 虽然Oracle的PL/SQL功能更强,但是它不支持标准的PSM语言来编写存储过程,因此你可能不得不学习它的非标准的语法.24. Oracle不支持ENUM数据类型,只能通过使用基于文本的check约束或者创建外键关联表来实现.25. Mysql的一些更加神秘的表类型(例如,blackhole,csv),在Oracle中找不到相对应的功能. (不清楚blockhole是何种类型,不过Oracle的外部表(external table)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其他处理).26. Oracle中的Group By语句必须是确定的,它需要select list中出现的所有列都必须包含在group by从句中.27. Oracle的exp命令输出的dmp文件无法象Mysql的转储文件一样可以手工修改.28. Oracle的底层实现有较大变化,需要你学习UNDO与REDO segment,归档,以及DBWR进程. (个人认为Oracle相对于其他数据库的主要的优势可能就是其UNDO/REDO的设计了.)29. Oracle不是开源软件,因此你无法在上面进行修补/优化/修复/实现你自己的东西.Robert Hodges30. Oracle的查询优化是一件需要专家介入的工作.它的优化器比MySQL的要成熟的多,这意味着查询计划也相应的更加难以解释.如果你有一个大的应用,请准备好聘用一位了解如何有效进行此项工作的伙计.31. Oracle的基于成本的优化器的有效运行需要精确的统计信息.对于发生变化的表,需要定期的为其收集统计信息.批量数据加载进程也需要在处理过程中不时的执行estimate/compute statistics命令来收集统计信息以取得满意的性能.32. 在Oracle中,创建连接是个代价高昂的操作.性能良好的Oracle应用都倾向于使用连接池来最小化登陆的开销.33. Oracle应用需要应用prepared statement以获取可观的性能.如果你的应用不使用prepared statement的话,需要对应用进行调整.这是应用Oracle数据库的标准编程实践.(此处的prepared statement应该更多的是指使用绑定变量).34. 应用需要关闭结果集游标,否则很快就会遇到著名的”ORA-01000 Too many open cursors”错误.在Oracle中,这被认为是一个用户错误,需要你去调整你的代码.35. 繁忙系统上的长查询可能会遭遇到” ORA-01555 Snapshot too old”错误.可以通过调整redo 段的大小(有时通过调整应用)来消除此错误,但是还是需要你关注这一点.(此处的redo segments的表述是有点问题,此处应该是Undo tablespace以及对应的Undo Retention,Oracle没有所谓的redo segment的说法).36. Oracle没有类似于非事务表的概念.大部分Oracle用户都认可这一点.37. Oracle的临时表定义是持久的SQL对象,并且对所有用户都可见(此处应该理解成以此用户登陆的会话,Session).这一点与MySQL中使用的轻量级表有区别,在MySQL中,临时表是在单个会话内创建并销毁的.Denish Patel38. 在Oracle中,多个Alter Table操作不能在同一个SQL语句中执行,例如alter table emp modify name varchar(64) not null, add gender char(1) not null;39. 默认情况下,Oracle不会自动提交.40. KILL命令在Oracle中无效,它使用alter system kill命令.(不清楚第一个kill是什么概念,操作系统级别的kill,Oracle还是支持的,我经常使用).41. Oracle在Order by语句中不支持使用减号(-).(不清楚这个具体的减号是什么东西).42. Oracle的sqlplus命令行接口不支持高亮显示.Roland Bouman43. Oracle不支持group_concat或者类似的分组函数.需要你通过循环调取游标来实现,或者通过组合XMLAGG与XMLQUERY来实现你需要的查询.(在Oracle 9R2之后,可以使用自定义聚合函数来实现这个功能,到Oracle 11gR1之后,Oracle自己还提供了一个新的listagg分组函数来实现这个功能).44. 对于count(distinct expression)函数,Oracle只支持一个表达式(要么一个列名,要么*),而Mysql支持一组表达式. (在Oracle中要实现一组表达式,可以通过使用子查询来实现).45. Oracle对子查询的支持非常好.不要因为Mysql中的习惯而不去使用它.46. Oracle不支持用户变量(@num).如果你需要利用它来计算运行时总和,可以利用分析函数(窗口函数)来实现.如果用用户变量来实现特定的汇总函数功能,你将发现Oracle已经有内置得功能支持这些功能.(另外在Oracle中,可以通过在package中应用dbms_session来设置context以实现用户变量).47. Oracle没有区分TIME与DATE类型,Oracle的Date类型实际上就是一个DATETIME类型(但是比MySQL支持一个更大的日期范围).48. 相对于MySQL来讲,Oracle的存储过程与触发器功能与性能都要好很多.不要习惯性地不去使用它们.49. 如果需要在Oracle中编写存储过程,记得在开始编码前花点时间了解下Oracle是不是有相应的内置package.你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了.50 如果你在MySQL中有使用BLOB类型或者TEXT类型,你可能会将他们迁移到Oracle地BLOB与CLOB 中.然而,与MySQL不同,Oracle并不是透明地实体化这些数据.在大部分情况下,这确实是件好事情,但是它也意味着如果你只是想把BLOB/CLOB当作文本处理,你将需要花费大量琐碎的时间来使用LOB函数,在使用之初,LOB函数还是蛮让人气馁的.(LOB相关函数确实挺烦人,LOB的处理效率也非常差,即使是使用Oracle 11g的SecureFile).When you are old and grey and full of sleep,And nodding by the fire, take down this book,And slowly read, and dream of the soft lookYour eyes had once, and of their shadows deep;How many loved your moments of glad grace,And loved your beauty with love false or true,But one man loved the pilgrim soul in you,And loved the sorrows of your changing face;And bending down beside the glowing bars,Murmur, a little sadly, how love fledAnd paced upon the mountains overheadAnd hid his face amid a crowd of stars.The furthest distance in the worldIs not between life and deathBut when I stand in front of youYet you don't know thatI love you.The furthest distance in the worldIs not when I stand in front of youYet you can't see my loveBut when undoubtedly knowing the love from both Yet cannot be together.The furthest distance in the worldIs not being apart while being in loveBut when I plainly cannot resist the yearningYet pretending you have never been in my heart. The furthest distance in the worldIs not struggling against the tidesBut using one's indifferent heartTo dig an uncrossable river For the one who loves you.。
mysql和oracle的区别有哪些MySQL和Oracle有什么区别?两个数据库的特性是不同的,所以与Oracle相比,MySQL的使用方式不同;与MySQL相比,Oracle的使用情况有所不同。
它们的特点也是不同的。
下面我们就来具体看看MySQL和Oracle的区别有哪些。
1、本质的区别Oracle数据库是一个对象关系数据库管理系统(ORDBMS)。
它通常被称为Oracle RDBMS或简称为Oracle,是一个收费的数据库。
MySQL是一个开源的关系数据库管理系统(RDBMS)。
它是世界上使用最多的RDBMS,作为服务器运行,提供对多个数据库的多用户访问。
它是一个开源、免费的数据库。
2、数据库安全性MySQL使用三个参数来验证用户,即用户名,密码和位置;Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。
3、SQL语法的区别Oracle的SQL语法与MySQL有很大不同。
Oracle为称为PL / SQL的编程语言提供了更大的灵活性。
Oracle的SQL * Plus 工具提供了比MySQL更多的命令,用于生成报表输出和变量定义。
4、存储上的区别:与Oracle相比,MySQL没有表空间,角色管理,快照,同义词和包以及自动存储管理。
5、对象名称的区别:虽然某些模式对象名称在Oracle和MySQL中都不区分大小写,例如列,存储过程,索引等。
但在某些情况下,两个数据库之间的区分大小写是不同的。
Oracle对所有对象名称都不区分大小写;而某些MySQL对象名称(如数据库和表)区分大小写(取决于底层操作系统)。
6、运行程序和外部程序支持:Oracle数据库支持从数据库内部编写,编译和执行的几种编程语言。
此外,为了传输数据,Oracle数据库使用XML。
MySQL不支持在系统内执行其他语言,也不支持XML。
7、MySQL和Oracle的字符数据类型比较:两个数据库中支持的字符类型存在一些差异。
mysql、oracle存储过程语法区别mysql、oracle存储过程语法区别1、条件语句:mysql使用elseif关键字,oracle是elsif关键字;oracle:if表达式 then表达式;elsif表达式;endif;mysql:if表达式then表达式;elseif表达式;endif;2、字符串连接oracle使用 || ;mysql 使用concat函数;3、日期计算(年月日数)mysql:函数TimeStampDiff()是MySQL本身提供的可以计算两个时间间隔的函数,语法为:TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),其中unit 单位有如下几种,分别是:SECOND, MINUTE, HOUR, DAY,WEEK, MONTH, QUARTER, or YEAR。
1 当前时间:sysdate()1 字符转日期:str_to_date() 分隔符一致,年月日要一致;示例:select str_to_date('2008-4-2 15:3:28','%Y-%m-%d%H:%i:%s');1 日期转字符:DATE_FORMAT(date,format)1 S ELECT DATE_FORMAT(sysdate(), '%Y-%m-%d %H:%i:%s');1 数字转字符:concat(num,’’)oracle :months_between 求日期间隔月份,除以12即为间隔年份; 天数,只需要日期直接相减;当前时间:sysdate字符转日期:to_date()1 日期转字符:to_char(date,format) to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')1 数字转字符:to_char(num)4、 定义游标oracel :CURSOR curPlanIndex isSELECT a.INDEX_SCORE,c.enum_value,c.dn_value,c.up_value,c.score,c.score_desc FROM eval_plan_index aJOIN eval_index_score c onc.index_id=a.index_id and a.plan_id = c.plan_idWHERE a.plan_id = V_PLAN_ID and a.index_id= V_INDEX_ID order by dn_value;MYSQL:declare curPlanIndex cursor forSELECT a.INDEX_SCORE,c.enum_value,c.dn_value,c.up_value,c.score,c.score_desc FROM eval_plan_index aJOIN eval_index_score c onc.index_id=a.index_id anda.plan_id = c.plan_idWHERE a.plan_id = V_PLAN_ID and a.index_id= V_INDEX_ID order by dn_value;5、 selectinto 赋值oracle 有exception错误处理beginselect value_name into vc_num_unit fromsys_dictwhere dict_code = 'szdw' and value_code =v_num_unit and rownum <=1 ;exceptionwhen no_data_found thenvc_num_unit := '';end;mysql 如果select 没有数据,则不执行into操作,变量值保持为上次结果,需要手工重置。
MySql与Oracle的差别作者:李迅鹏前言:公司同事讯鹏的小作,精炼而全面。
基本上:一个是面向商业环境和用户的付费数据库,讲究可靠稳定和事务ACID原则以及标准的SQL-92事务隔离级别,一个则是发硎于开源社区,伴随web应用的扩展和深入而逐渐曲折发展的免费数据库,对事务和数据一致性没有严格要求,同时也不支持海量大并发(通常情况下,特殊的优化情况下:在SAAC 2010上百度的刘斌同志已经讲过,12000的seqential读QPS;6000的random读;以及4000的混合QPS,还是不错的呵呵)。
本文也不取题为“性能特性比较”而是“差别”,就是此意。
所以,淘宝才在交易系统上使用海量oracle,同时也有大量的mysql的installbase 。
正文:近期突击学习了mysql,应杨毅的邀请,简单比较一下mysql 和oracle的差别,不当之处欢迎大家指正。
一、并发性并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。
mysql:mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
oracle:oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。
所以oracle对并发性的支持要好很多。
二、一致性oracle:oracle支持serializable的隔离级别,可以实现最高级别的读一致性。
每个session提交后其他session才能看到提交的更改。
oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session查询时,如果对应的数据块发生变化,oracle 会在undo表空间中为这个session构造它查询时的旧的数据块。
浅谈Mysql、SqlServer、Oracle三⼤数据库的区别⼀、MySQL优点:1. 体积⼩、速度快、总体拥有成本低,开源;2. ⽀持多种操作系统;3. 是开源数据库,提供的接⼝⽀持多种语⾔连接操作;MySQL的核⼼程序采⽤完全的多线程编程。
线程是轻量级的进程,它可以灵活地为⽤户提供服务,⽽不过多的系统资源。
⽤多线程和C语⾔实现的mysql能很容易充分利⽤CPU;MySql有⼀个⾮常灵活⽽且安全的权限和⼝令系统。
当客户与MySql服务器连接时,他们之间所有的⼝令传送被加密,⽽且MySql⽀持主机认证;⽀持ODBC for Windows,⽀持所有的ODBC 2.5函数和其他许多函数,可以⽤Access连接MySql服务器,使得应⽤被扩展;⽀持⼤型的数据库,可以⽅便地⽀持上千万条记录的数据库。
作为⼀个开放源代码的数据库,可以针对不同的应⽤进⾏相应的修改;拥有⼀个⾮常快速⽽且稳定的基于线程的内存分配系统,可以持续使⽤⾯不必担⼼其稳定性;MySQL同时提供⾼度多样性,能够提供很多不同的使⽤者介⾯,包括命令⾏客户端操作,⽹页浏览器,以及各式各样的程序语⾔介⾯,例如C+,Perl,Java,PHP,以及Python。
你可以使⽤事先包装好的客户端,或者⼲脆⾃⼰写⼀个合适的应⽤程序。
MySQL可⽤于Unix,Windows,以及OS/2等平台,因此它可以⽤在个⼈电脑或者是服务器上。
缺点:1. 不⽀持热备份;2. MySQL最⼤的缺点是其安全系统,主要是复杂⽽⾮标准,另外只有到调⽤mysqladmin来重读⽤户权限时才发⽣改变;3. 没有⼀种存储过程(Stored Procedure)语⾔,这是对习惯于企业级数据库的程序员的最⼤限制;4. MySQL的价格随平台和安装⽅式变化。
Linux的MySQL如果由⽤户⾃⼰或系统管理员⽽不是第三⽅安装则是免费的,第三⽅案则必须付许可费。
Unix或linux ⾃⾏安装免费、Unix或Linux 第三⽅安装收费。
mysql不能做但是oracle可以做的有好多。
我就简单说点例子:Oracle 可以执行匿名的代码段,例如:SQL> set serveroutput onSQL> BEGIN2 dbms_output.put_line('Hello World');3 END;4 /Hello WorldMySQL 不能执行匿名的,必须创建存储过程Oracle 可以在2个表之间MERGE ,如果有数据则更新,没有则插入。
-- 源表CREATE TABLE test_from (id INT, val VARCHAR(20));-- 目标表CREATE TABLE test_to (id INT, val VARCHAR(20));-- 插入源表INSERT INTO test_from VALUES (1, 'A');INSERT INTO test_from VALUES (2, 'B');-- 合并源表到目标表MERGE INTO test_toUSING test_fromON ( test_to.id = test_from.id ) -- 条件是id 相同WHEN MATCHED THEN UPDATE SET test_to.val = test_from.val -- 匹配的时候,更新WHEN NOT MATCHED THEN INSERT VALUES(test_from.id, test_from.val) -- 源表有,目标表没有,插入MySQL 好像没有。
Oracle 支持Check 约束SQL> CREATE TABLE test_create_tab4 (2 id INT PRIMARY KEY,3 val VARCHAR(10)4 CONSTRAINT test_tab4_val_nn NOT NULL,5 val2 INT,6 CONSTRAINT test_tab4_val2_100 CHECK(val2 >= 0 AND val2 <= 100)7 );MySQL Check 只是用来看的。
一、并发性
并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。
mysql:
mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。
虽然InnoDB引擎的表可以用行级锁,但这个行级锁的机制依赖于表的索引,如果表没有索引,或者sql语句没有使用索引,那么仍然使用表级锁。
oracle:
oracle使用行级锁,对资源锁定的粒度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖与索引。
所以oracle对并发性的支持要好很多。
二、一致性
oracle:
oracle支持serializable的隔离级别,可以实现最高级别的读一致性。
每个session提交后其他session才能看到提交的更改。
oracle通过在undo表空间中构造多版本数据块来实现读一致性,
每个session查询时,如果对应的数据块发生变化,oracle会在undo表空间中为这个session构造它查询时的旧的数据块。
mysql:
mysql没有类似oracle的构造多版本数据块的机制,只支持read commited 的隔离级别。
一个session读取数据时,其他session不能更改数据,但可以在表最后插入数据。
session更新数据时,要加上排它锁,其他session无法访问数据。
三、事务
oracle很早就完全支持事务。
mysql在innodb存储引擎的行级锁的情况下才支持事务。
四、数据持久性
oracle
保证提交的数据均可恢复,因为oracle把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,
如果出现数据库或主机异常重启,重启后oracle可以考联机在线日志恢复客户提交的数据。
mysql:
默认提交sql语句,但如果更新过程中出现db或主机重启的问题,也许会丢失数据。
五、提交方式
oracle默认不自动提交,需要用户手动提交。
mysql默认是自动提交。
六、逻辑备份
oracle逻辑备份时不锁定数据,且备份的数据是一致的。
mysql逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用。
七、热备份
oracle有成熟的热备工具rman,热备时,不影响用户使用数据库。
即使备份的数据库不一致,也可以在恢复时通过归档日志和联机重做日志进行一致的回复。
mysql:
myisam的引擎,用mysql自带的mysqlhostcopy热备时,需要给表加读锁,影响dml操作。
innodb的引擎,它会备份innodb的表和索引,但是不会备份.frm文件。
用ibbackup备份时,会有一个日志文件记录备份期间的数据变化,因此可以不用锁表,不影响其他用户使用数据库。
但此工具是收费的。
innobackup是结合ibbackup使用的一个脚本,他会协助对.frm文件的备份。
八、sql语句的扩展和灵活性
mysql对sql语句有很多非常实用而方便的扩展,比如limit功能,insert可以一次插入多行数据,select某些管理数据可以不加from。
oracle在这方面感觉更加稳重传统一些。
九、复制
oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,主库出现问题是,可以自动切换备库到主库,但配置管理较复杂。
mysql:复制服务器配置简单,但主库出问题时,丛库有可能丢失一定的数据。
且需要手工切换丛库到主库。
十、性能诊断
oracle有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。
比如awr、addm、sqltrace、tkproof等
mysql的诊断调优方法较少,主要有慢查询日志。
十一、权限与安全
mysql的用户与主机有关,感觉没有什么意义,另外更容易被仿冒主机及ip有可乘之机。
oracle的权限与安全概念比较传统,中规中矩。
十二、分区表和分区索引
oracle的分区表和分区索引功能很成熟,可以提高用户访问db的体验。
mysql的分区表还不太成熟稳定。
十三、管理工具
oracle有多种成熟的命令行、图形界面、web管理工具,还有很多第三方的管理工具,管理极其方便高效。
mysql管理工具较少,在linux下的管理工具的安装有时要安装额外的包(phpmyadmin,etc),有一定复杂性。