原文地址:https://www.zhihu.com/question/29088685
最近听了阿里的一个分享会,发现他们完成了整体从oralce转换为MysqL的过程。为什么很多公司都开始去oracle而使用MysqL?关于这个问题已经看到很多很多很多次了,在浏览了各家之言后,就借知乎这块宝地,我也写一点我的看法,可能会有点长。
首先,题主直接问为什么,这个明显不符合知乎的规矩嘛,咱要先来看看 是不是真的很多公司开始去oracle而使用MysqL。
historical trend of the popularity ranking of database management systems
<img src="https://pic4.zhimg.com/b66ab8f2f92ca7414e35d63d70450bcf_b.jpg" data-rawwidth="2006" data-rawheight="1208" class="origin_image zh-lightBox-thumb" width="2006" data-original="https://pic4.zhimg.com/b66ab8f2f92ca7414e35d63d70450bcf_r.jpg">从图片来看,oracle和MysqL的流行程度没有明显的逆转,oracle还是关系形数据库中的老大。 从图片来看,oracle和MysqL的流行程度没有明显的逆转,oracle还是关系形数据库中的老大。我没有找到在互联网行业中的统计数据,希望有知友补充。在知道了是不是之后,正式开始答题。
我本人是一个MysqL dba,对于oracle了解不多,所以要我直接从正面去解答这个问题呢,多多少少都是会有一些偏袒的,所以我想把这个问题转化一下,就是 一个公司在作出数据库选型转变的时候,需要考虑哪些方面的因素?淘宝从oracle转为MysqL可以作为这个问题很好的一个例子。
成本因素
我们都知道MysqL是开源的,也就是说完全免费,而oracle价格不菲,如果再考虑到搭载oracle的服务器和存储设备的话,那直接可以看见的成本差距确实很大,这是现实。但是这样就简单的判断从oracle迁移到MysqL就一定节约成本,我觉得这个事儿不好说。 直接根据产品本身购买价格算成本的方式不能说错,但是肯定不全面,还漏了不少东西要算。
@歪脖大肚子Q问:假如Oracle的许可证费用足够低,还会换用OB吗?按照大部分人都解释,可能从安全方面考虑,@王少亚认为关键不是费用,是可控性 。但是事实很简单,就是Oracle要价太高。淘宝顶级科学家阳振坤微博号@阿里正祥 回复@王少亚:很多人猜测答案是NO,非也,答案是YES,而且是在费用上,呵呵。可以想象马云当时是多么火大,你收我那么多钱,跟我阿里的理念完全相反啊。我成本无限高,我怎么服务中小企业!必须上马。@阿里正祥表示:目前 OceanBase做到了商业数据库成本的一半以下,这得益于OceanBase不再需要昂贵的共享存储、高可靠的服务器、数据库软件的许可费。 OceanBase还有很大的性能提升空间和成本降低空间。
有网友问为什么不用MysqL?
@阿里正祥回答,“金融系统要求在主库故障的时候不能丢失任何数据(地震等天灾人祸除外),MysqL无法做到这一点(如果不使用共享存储的话)。 ”
<img src="https://pic1.zhimg.com/00a47de293fd3ea44a342f1a4bf658c4_b.jpg" data-rawwidth="601" data-rawheight="280" class="origin_image zh-lightBox-thumb" width="601" data-original="https://pic1.zhimg.com/00a47de293fd3ea44a342f1a4bf658c4_r.jpg">对于是否增加硬件采购,@阿里正祥表示,机器确实增加了,但也没有这个同学说的这么夸张(一个同学认为机器增加了7-8倍),不知道这个数据从何而来。对于这个交易系统,跟商业数据库相比,OceanBase成本更低,同时还提供了超过一倍的性能和容量。
OceanBase技术负责人正祥的新浪微博: weibo.com 的页面。
OceanBase技术负责人正祥的新浪微博: weibo.com 的页面。
目前OceanBase已经应用于淘宝收藏夹,用于存储淘宝用户收藏条目和具体的商品、店铺信息,每天支持4~5千万的更新操作。等待上线的应用还包括CTU、SNS等,每天更新超过20亿,更新数据量超过2.5TB,并会逐步在淘宝内部推广。
风险成本:2008年的淘宝是一辆在高速公路上飞驰的汽车,业务发展是很快的,这个时候要 迁移数据库这样的基础架构,那必然是牵一发而动全身的事情。就好比要给这辆在高速公路上的汽车换个引擎,车还不能熄火, 这个事情本身的难度和风险就是很大的。
人力成本:大量开发人员做重构的时候还是要拿工资的吧。 新技术的学习成本也要算进去,这个包括了 运维的dba和各个业务的开发人员,凡是需要用db的人都要新学一遍,这也要花不少时间和精力。 还有在决定迁移的这一刻,对于之前的一些技术的积累,包括人员的培养等方面,一定是有浪费的,物体的运动轨迹发生突变往往意味着能量损失,这是一个道理。 随着技术转型,一批老的出色的oracle dba和开发人员的流失带来的损失更难估量。
如果把这些七七八八都算进去的话,那还 真的一定节约成本么?至少在短时间内,这个事儿不好说,反正我是老板的话,我算不清。
业务因素
这里可能用“ 业务场景”这个词解释更加合适,或者说这是一个 数据库选型的问题。根据淘宝架构师在公开场合的描述,当时淘宝的业务量发展太快了,这使得原本基于oracle旧架构的系统扩展性不能很好支撑整个业务了, 架构解藕这件事已经是车到山前了,这就意味着业务需要分拆,数据库需要分拆。 如果业务只需要十几个或者几十个集群就能承载的话,那我觉得oracle完全ok,但是现在大型互联网公司的业务规模都是需要上百集群,上千机器来承载,对于这样的规模,MysqL这样轻量级的数据库更合适。所以这里不是谁更好的问题,只是 哪种数据库产品更适合当前及未来公司的业务场景,换句话说,就是“物尽其用”而已。 现在不是也有很多数据从MysqL向nosql迁移了么。
技术趋势
当前互联网技术发展有个整体的趋势,就是开源产品为主流。oracle是这个世界上到目前为止最优秀的 关系形数据库产品,但是他闭源, 闭源就意味着在整个互联网大行业背景下,这个产品本身就可能变的越来越小众,对于一家互联网公司使用的 基础架构本身很小众的话还不是什么太大的问题,但是其导致的 技术上的壁垒就很难接受了, 自己最核心的基础架构掌握在别人家手里,核心技术都是人家的,这就好比芒刺在背。打个可能不太恰当的比方吧,有一天你LOL天梯打到了2000,但是你发现你的圈子里已经没什么人玩这个了,别人都去玩另外一个游戏了,而且还是别人自己开发的游戏,代码能自己改,能自己写外挂能加英雄加功能。 你当然可以继续玩LOL,你可以始终是个顶级玩家,但是同时你失去了成为顶级游戏开发者的机会。
说到这里我想再延伸一下,有个成语叫“不破不立”,拿 淘宝迁到MysqL的例子来说的话(迁MysqL我想可能只是一部分),淘宝在这个 分拆重构的过程中积累了很多技术。淘宝内部人员也在公开场合也提到过,淘宝在那段时间诞生了很多出色的架构师,积累很多新技术,比如很多 中间件,底层针对MysqL的优化,运维工具等等,可能没有当时的那次变革, 阿里的RDS出现可能还要晚几年,甚至出不来。
分布式存储用MysqL方便;
MysqL经过这么多年本身也成熟,比如备份、主备库、有经验的MysqL的dba人数增多;
MysqL开源,有技术资源的大公司可以定制开发些东西;
互联网类的应用对数据库依赖越来越小,比如触发器、存储过程等很多都不建议用,到最后数据库完全就是用来存储结构化重要数据的这么一个东东,导致oracle优势小了很多,反正到最后发现oracle也就是存储数据用的,其他的都没用上;
非结构化非核心的数据存储用了nosql,对数据库特殊数据类型的依赖小了;
复杂的数据运算有专门的分布式计算做比如Hadoop,对数据库的特殊查询比如分析函数依赖小了;
先考虑钱:
1. 又穷又没技术的,菜市场门口有卖熟菜,但选择不多。胜在价廉物美,并且如果你买了油炸鸡块。再去超市买几瓶啤酒,在晚上吃的话,可以组成经典的“啤酒炸鸡看星星”这种有b格的组合。另外有些熟菜摊可能是高级饭店出来为了“自由”做个体户的!
2. 有钱没技术的,对菜有要求的一般都会去五星级饭店,全方位保证,b格满,安全卫生口味好,选择多,而且有大龙虾鱼翅鲍鱼满足挑剔的食客。
结论:大部分不选择五星级饭店接待客人的,并不是因为自己做的比五星级饭店更好吃,搭配更好。毕竟不是每家人都擅长做菜,家里有厨师比五星级大厨还nb的,也是少数中的少数。 也就阿里等大公司能拿出来讲讲,问题人家养了一个什么团队?你其他公司养的起么!
原因很简单,oracle已经不能满足他们的需求,或者成本太高无法接受,使用oracle的成本已经比自己养活一只团队改MysqL的成本要高。MysqL开源对顶尖的互联网公司来说最大的好处就是有源码,看哪里不满意就把哪里改了,因为顶尖互联网团队的员工足够NB。你说MysqL不稳定,那我把MysqL改成稳定的;性能差?那我把它某一方面的性能改强。多次修改后估计已经和社区版有很大差别了。基本上可以认为阿里或Facebook自己搞了(开发)个不怎么开源的阿里版MysqL和Facebook版MysqL,和MysqL的关系估计和MariaDB与MysqL的关系有的一比,至于是否高度兼容就不太好说。
SQL Server,MySQL,Oracle三者的区别
http://www.cnblogs.com/tufujie/p/5071669.htmlOracle和MysqL的主要区别
Oracle:客户端和命令窗口,都是由用户决定内容-> conn user_name/password;
MysqL:客户端和命令窗口,都是由数据库决定内容-> use datebase;
都可以创建多数据库多用户,个人倾向于Oracle一个数据库中多个用户的形式,MysqL多个数据库多个用户形式(最好每个数据库对应一个用户)
Oracle是大型数据库而MysqL是中小型数据库,Oracle市场占有率达40%,MysqL只有20%左右,同时MysqL是开源的而Oracle价格非常高。
Oracle支持大并发,大访问量,是OLTP(On-Line Transaction Processing联机事务处理系统)最好的工具。
安装所用的空间差别也是很大的,MysqL安装完后才152M而Oracle有3G左右,且使用的时候Oracle占用特别大的内存空间和其他机器性能。
Oracle也与MysqL操作上的一些区别
聚合函数用法规则
MysqL中聚合函数在select语句中可以随意使用,但在Oracle中如果查询语句中有聚合函数,那其他列名必须是聚合函数处理过的,或者是group by子句中的列否则报错
eg:
select name,count(money) from user;这个放在MysqL中没有问题在Oracle中就有问题了。
自动增长的数据类型处理
MysqL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。Oracle没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
CREATE SEQUENCE序列号的名称(最好是表名+序列号标记)INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE;
其中最大的值按字段的长度来定,如果定义的自动增长的序列号NUMBER(6),最大值为999999
INSERT语句插入这个字段值为:序列号的名称.NEXTVAL
单引号的处理
MysqL里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
翻页的sql语句的处理
MysqL处理翻页的sql语句比较简单,用LIMIT开始位置,记录个数;PHP里还可以用SEEK定位到结果集的位置。Oracle处理翻页的sql语句就比较繁琐了。每个结果集只有一个ROWNUM字段标明它的位置,并且只能用ROWNUM<100,不能用ROWNUM>80。
以下是经过分析后较好的两种Oracle翻页sql语句(ID是唯一关键字的字段名):
语句一:
SELECT ID,[FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM AS NUMROW,ID FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;
语句二:
SELECT * FROM (( SELECT ROWNUM AS NUMROW,c.* from (SELECT [FIELD_NAME,...] FROM TABLE_NAME WHERE 条件1 ORDER BY 条件2) c) WHERE NUMROW > 80 AND NUMROW < 100 ) ORDER BY 条件3;
长字符串的处理
长字符串的处理Oracle也有它特殊的地方。INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用Oracle里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
日期字段的处理
MysqL日期字段分DATE和TIME两种,Oracle日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为SYSDATE,精确到秒,或者用字符串转换成日期型函数TO_DATE('2001-08-01','YYYY-MM-DD')年-月-日24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式,可以参看Oracle DOC.
日期型字段转换成字符串函数TO_CHAR('2001-08-01','YYYY-MM-DD HH24:MI:SS')
日期字段的数学运算公式有很大的不同。MysqL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)Oracle找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;
MysqL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now())
而Oracle中当前时间是sysdate
空字符的处理
MysqL的非空字段也有空的内容,Oracle里定义了非空字段就不容许有空的内容。按MysqL的NOT NULL来定义Oracle表结构,导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
字符串的模糊比较
MysqL里用字段名like%'字符串%',Oracle里也可以用字段名like%'字符串%'但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,'字符串')>0会得到更精确的查找结果。
程序和函数里,操作数据库的工作完成后请注意结果集和指针的释放。
主键
MysqL一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,MysqL将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
Oracle实现了ANSIIsql中大部分功能,如,事务的隔离级别、传播特性等而MysqL在这方面还是比较的弱
mysql、MsSqlserver和Oracle的特点,优缺点
http://blog.itpub.net/21981351/viewspace-1117082/
http://www.cnblogs.com/baochuan/archive/2012/03/15/2398276.html
http://blog.csdn.net/xifeijian/article/details/20316775