欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用MySQL去Oracle

程序员文章站 2022-05-28 16:57:41
...

一.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而不是单条导入

相关标签: mysql oracle