Oracle与MySQL的几点区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle与MySQL的几点区别相关的知识,希望对你有一定的参考价值。

参考技术A Oracle数据库与mysql数据库的区别是本文我们主要介绍的内容 希望能够对您有所帮助

   组函数用法规则

  mysql中组函数在select语句中可以随意使用 但在oracle中 如果查询语句中有组函数 那其他列名必须是组函数处理过的 或者是group by子句中的列 否则报错

  eg

  select name count(money) from user ;这个放在mysql中没有问题 在oracle中就有问题了

   自动增长的数据类型处理

  MYSQL有自动增长的数据类型 插入记录时不用操作此字段 会自动获得数据值 ORACLE没有自动增长的数据类型 需要建立一个自动增长的序列号 插入记录时要把序列号的下一个值赋于此字段

  CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY START WITH MAXVALUE CYCLE NOCACHE;

  其中最大的值按字段的长度来定 如果定义的自动增长的序列号 NUMBER( ) 最大值为

  INSERT 语句插入这个字段值为: 序列号的名称 NEXTVAL

   单引号的处理

  MYSQL里可以用双引号包起字符串 ORACLE里只可以用单引号包起字符串 在插入和修改字符串前必须做单引号的替换 把所有出现的一个单引号替换成两个单引号

   翻页的SQL语句的处理

  MYSQL处理翻页的SQL语句比较简单 用LIMIT 开始位置 记录个数;php里还可以用SEEK定位到结果集的位置 ORACLE处理翻页的SQL语句就比较繁琐了 每个结果集只有一个ROWNUM字段标明它的位置 并且只能用ROWNUM< 不能用ROWNUM>

  以下是经过分析后较好的两种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 条件 ORDER BY 条件 ) WHERE NUMROW > AND NUMROW < ) ORDER BY 条件 ;

  语句二

  SELECT * FROM (( SELECT ROWNUM AS NUMROW c * from (select [FIELD_NAME ] FROM TABLE_NAME WHERE 条件 ORDER BY 条件 ) c) WHERE NUMROW > AND NUMROW < ) ORDER BY 条件 ;

   长字符串的处理

  长字符串的处理ORACLE也有它特殊的地方 INSERT和UPDATE时最大可操作的字符串长度小于等于 个单字节 如果要插入更长的字符串 请考虑字段用CLOB类型 方法借用ORACLE里自带的DBMS_LOB程序包 插入修改记录前一定要做进行非空和长度判断 不能为空的字段值和超出长度字段值都应该提出警告 返回上次操作

    日期字段的处理

  MYSQL日期字段分DATE和TIME两种 ORACLE日期字段只有DATE 包含年月日时分秒信息 用当前数据库的系统时间为SYSDATE 精确到秒 或者用字符串转换成日期型函数TO_DATE( YYYY MM DD )年 月 日 小时:分钟:秒 的格式YYYY MM DD HH :MI:SS TO_DATE()还有很多种日期格式 可以参看ORACLE DOC 日期型字段转换成字符串函数TO_CHAR( YYYY MM DD HH :MI:SS )

  日期字段的数学运算公式有很大的不同 MYSQL找到离当前时间 天用 DATE_FIELD_NAME > SUBDATE(NOW() INTERVAL DAY)ORACLE找到离当前时间 天用 DATE_FIELD_NAME >SYSDATE ;

  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(字段名 字符串 )> 会得到更精确的查找结果

lishixinzhi/Article/program/MySQL/201404/30556

Mysql优化的几点总结

正常情况下,初创公司的流量并不是很大,mysql数据库在未做优化的情况依然可以满足性能要求,特别是5.6版本后mysql在性能上还是有了很大提升,所以在初期并没有花精力在此上面。但后来发生的一系列问题还是说明mysql性能优化在项目启动时就应该重视起来。下面就出现问题的原因和需要注意的地方说明如下:

问题来源

开发人员之前多数使用oracle,由于oracle强大的性能和所做项目多是内部企业应用,不太可能出现性能问题。在这样的背景下,开发人员依然按照原来的方式来写代码,导致后来性能问题,总结有以下几点:

1.sql多表联合查询,常常是3,4张表联合查询

2.sql中使用大量函数

3.sql中直接select *

4.表字段缺少索引或者索引方式不对

5.表设计考虑不周,出现大量空字段

6.表主键设计成UUID,由于使用传统机械硬盘,对寻址非常不利

7.过多使用触发器

8.sql中存在复杂计算

解决方案

首先通过慢日志过滤出大于1s的sql语句,解决mysql性能问题,一定要利用好慢日志。然后通过执行计划(explain)来查看sql的执行情况。具体优化措施如下:

联合查询分拆成单表查询

如果此sql是联合查询,首先确认是否是可以拆分成单表查询,然后通过程序来进行处理数据。最多不能超过两表联合查询。

建立合适索引

通过执行计划,对全表扫描的查询一定要建立索引,在建立索引时,一定要考虑到此字段是否有大量空字段,字段值是否大量重复,可区分度是否高,不然建立索引的意义不大,反而是影响insert 和 delete操作。对于长字符类型的字段,增加算因时,需要增加前缀,计算方式为:select count(distinct left(b,5)) /count(distinct b) as left5,count(distinct left(b,6))/count(distinct b) as left6 from test_unique
limit 1,其中5,6是预估值,对于UUID这样长字符类型,一般前缀是6.增加索引时sql语句为:alter table test.test_unique add key (left(6));。 对于不能重复的字段,建议使用唯一索引,一是保证插入值唯一,二是提高查询速度 。 在where、order 、group by后面的字段,尽量建立索引,通过需要注意的是如果where后面是多字段,那么需要建立联合索引,而不是单个建立索引,并且需要注意联合索引的顺序,例如where a=‘x‘ and b = ‘y‘,在其它sql中出现where
b=‘z’这样的情况,那么联合索引顺序为(b,a),而不是单独建立(a,b)和(b)两个索引,因为在建立联合索引(b,a)时,mysql会建立两个索引(b),(b,a)两个索引。

避免索引失效

在字段上使用函数将会使索引失效,因此一定要避免在左侧字段使用函数,而是提前在程序里处理好。

尽量避免函数

mysql提供了大量的函数,但对于这些函数,尽量不要用,而是在程序里进行处理,目前mysql对于这些函数优化工作做的并不是很好,往往有时候会导致严重的性能问题。

表主键使用自增序列

表主键尽量采用自增序列,这样可以充分mysql的存储特性,mysql采用B+树存储。需要注意的地方在于:如果是分库分表,那么需要不能直接使用自增序列,需要采用其他方法来完成,常用的方式通过redis来维护一套ID。

以上是关于Oracle与MySQL的几点区别的主要内容,如果未能解决你的问题,请参考以下文章

带头结点与不带头节点的几点区别

ROM和RAM的几点区别

MYSQL和ORACLE的一些区别

MYSQL和ORACLE的一些区别

MYSQL和ORACLE的一些区别

转:MySQL和Oracle的一些区别