当前位置: 代码迷 >> MySQL >> 利用MySQL往Oracle
  详细解决方案

利用MySQL往Oracle

热度:213   发布时间:2016-05-05 16:30:17.0
利用MySQL去Oracle

一.Oracle vs MySQL

1.性能不分高低,在于使用方式,扬长避短

? ? ? ? Oracle强大到几乎能做所有事情 ----- 强大的计算节点

? ? ? ? MySQL主要还是用来存储数据和简单查询 ----- 定位为存储节点

? ? ? ? MySQL对复杂查询/数据分析支持偏弱,需要业务改造或是通过其他方式来支持

2.不管Oracle/MySQL,复杂SQL总是成为系统不稳定的主要因素,出问题通常也都是复杂SQL(执行计划走错)导致的,化繁为简。

3.锁差异

? ? ? ? Oracle锁加在数据块上,InnoDB锁加在主键索引上,所以InnoDB总是有主键索引。

4.导入导出数据

? ? ? ? Oracle采用EXP/IMP导入导出。

? ? ? ? MySQL采用mysqldump导出,导入可以采用管道或source。mysqldump –u用户 –p密码 DB [table1 table2…] > db.sql

5.提交方式

? ? ? ? MySQL默认自动提交,Oracle默认手动提交,MySQL大批量操作最好改变为手动提交,SET AUTOCOMMIT=0

6.SQL缓存

? ? ? ? MySQL只能缓存结果集,不能缓存SQL解析结果

7.数据库对象

? ? ? ? Oracle将数据库对象编译存储,直接执行二进制码,MySQL只存储代码,临时解析执行,所以MySQL触发器、存储过程等对象创建时仅检查语法,并不检查逻辑。

8.MySQL对子查询会处理为临时表,所以一般JOIN效率比做子查询高。

9.MySQL在JOIN中对ORDER BY、GROUP BY优化较弱,JOIN中的排序分组几乎都会使用Fille Sort和临时表。

10.MySQL只有RBO,没有CBO,所以总是选择类型上最优的执行计划,而不一定是开销最小的。

11.MySQL对于OR,很多时候并不会优化成两次索引访问或合并索引,所以OR最好写成两条SQL,做UNION ALL。

12.IN中存在NULL条件,可能会让优化器走成全表扫描。

?

二.去Oracle的关键点

1.去”IOE”,大部分精力oracle到MySQL改造上

a. 集中式改造到分布式(非必选)

b. 复杂SQL改造

c. 存储过程/函数的改造

d. 数据无缝迁移到MySQL上

e. 数据分析的改造

2.功能:Oracle 到 MySQL 功能上落差大,存储过程,join

3.高可用:小型机,存储高冗余机制,PC怎么做?

4.数据一致性:Oracle物理级别的一致, MySQL有没有问题

细分:如何去存储过程;如何无缝数据迁移;如何分库分表分事务;如何数据路由;如何异构数据实时同步;如何数据安全;如何面对规模运维。

?

三.应用的改造点

1.数据库的本质还是存储数据,Oracle基本上能把所有事情都做掉(将计算推向数据),使用MySQL要把业务处理重新剥离到应用程序来做(将数据推向计算)。

2.改造点:

? ? ? ? a.应用逻辑重新梳理重构,进行服务化;服务化不仅是确定功能接口,更重要的是定义SLA(对外提供的QPS、RT等性能指标)

? ? ? ? b.根据数据库特性重构应用,让MySQL数据库做擅长的事情(存储数据)

? ? ? ? c.MySQL一定要去避免大SQL,大事务,大批量,分步骤实现化繁为简

? ? ? ? d.DB扩展难,而APP很容易扩展,尽量在应用程序实现业务逻辑和计算

? ? ? ? e.DB单实例满足可能需要做数据库拆分(先垂直在水平),拆分的解决方案

3.使用MySQL把握住:

? ? ? ? a.用来存储数据 ?

? ? ? ? b.ACID支持

? ? ? ? c.处理简单查询。

?

四.MySQL本身的硬伤

1.Join查询/子查询/复杂查询。

2.数据分析

3.单实例性能瓶颈(分布式带来的问题?)

4.MySQL的门槛(bug,使用门槛,debug)

?

五.MySQL开发规范

1.基本要求

a.尽量不在数据库做运算

b.控制单表数据量(控制在500万级别)

c.平衡范式和冗余,适当的在表中冗余字段,减少关联查询

d.数据库不能随意线性扩展,资源宝贵,应用能做的尽量不用数据库

e.规范化,不因为赶工期代码一塌糊涂

f.SQL处理上,尽量化复杂为简单,复杂SQL拆分为多步骤实现,拒绝大SQL/大事务

2.字段/表

a.字段多使用数字(int)类型而不是字符型(varchar)

b.字段尽量设置为not null

c.表必须要有主键,最好是自增主键,一定是innodb引擎。

d.少用字段text,blob类型,不用数据库存储图片

e.表不使用外键,应用保证一致性

3.SQL写法

a. 使用单表查询,关联查询控制在2个表以内

b. 禁止使用子查询(in,exists),尽量使用join关联查询改写

c. 对复杂SQL进行拆分,借用临时表或是其他保留中间结果集,或是分多个步骤

d. 存储过程/函数通过应用程序来改写掉。

e. Where后面的条件不使用函数转化比如where inst(a,’xx’)=

f. 所有SQL都要去REVIEW才能上线,确保性能,合理使用索引,

g. 避免使用select *

h. 使用MySQL 高效分页优化写法

i. 注意SQL规范,避免字段类型隐式转换比如where name=123 ? ??

j.批量数据导入尽量使用load data,或是insert values, values,values而不是单条导入

  相关解决方案