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