优化器差异
MySQL对子查询会处理为临时表,所以一般JOIN效率比做子查询高。
MySQL在JOIN中对ORDER BY、GROUP BY优化较弱,JOIN中的排序分组几乎都会使用Fille Sort和临时表
MySQL只有RBO,没有CBO,所以总是选择类型上最优的执行计划,而不一定是开销最小的。
MySQL对于OR,很多时候并不会优化成两次索引访问或合并索引,所以OR最好写成两条SQL,做UNION ALL。
IN中存在NULL条件,可能会让优化器走成全表扫描。
SQL方言差异
选择部分行:Oracle使用Rownum,MySQL使用LIMIT start,end;
执行函数:Oracle需要SELECT f() FROM dual; MySQL可以直接SELECT f();
复制数据:Oracle必须有as,CREATE TABLE t AS SELECT * FROM table;
MySQL的as是可选的,CREATE TABLE t SELECT * FROM table;
常用功能差异
锁差异:Oracle锁加在数据块上,InnoDB锁加在主键索因上,所以InnoDB总是有主键索引。
导入导出数据:Oracle采用EXP/IMP导入导出。
MySQL采用mysqldump导出,导入可以采用管道或source。
mysqldump –u用户 –p密码 DB [table1 table2…] > db.sql
提交方式:MySQL默认自动提交,Oracle默认手动提交,MySQL大批量操作最好改变为手动提交,SET AUTOCOMMIT=0
SQL缓存:MySQL只能缓存结果集,不能缓存SQL解析结果
数据库对象:Oracle将数据库对象编译存储,直接执行二进制码,MySQL只存储代码,临时解析执行,所以MySQL触发器、存储过程等对象创建时仅检查语法,并不检查逻辑