参考: 遵守GPL协议的MySQL数据库 甲骨文是否有权收费?
(http://www.cnbeta.com/articles/187202.htm)
2008年1月SUN收购mysql, 2009年4月oracle收购sun。
MySQL根据收费与否,分为MySQL Community Server(即社区版)和MySQL Enterprise Edition(即商业版):
什么是 MySQL Community Server?
全球最流行的开源数据库,可免费下载,在开源GPL许可证之下可以自由的使用。但是Mysql不提供官方技术支持。
什么是MySQL商业版?
MySQL的收费版本,这是全球最流行的开源数据库最可靠、最安全的最新版本。
企业版和社区版区别?
一 mysql版本信息:
目前在oracle官网能下载的最新版本是: MySQL Community Server 5.6.12
各版本的差异请见:mysql各版本介绍
二mysql与oracle常用数据类型对照
| Oracle | Mysql | 描述 |
| number(10) | int bigint | int--存9位整数 bigint--存19位整数 |
| number(7,2) | decimal(7,2) | |
| varchar2 | varchar | |
| blob | longblob | |
| char | char | |
| date | date datetime | Date以yyyy-mm-dd格式存储 Datetime以yyyy-mm-dd hh:mi:ss格式存储 |
| 比较项 | oracle | mysql | |
| 1 | 空串('')的判断 | NAME IS NULL | NAME='' OR NAME =' ' OR NAME =' ' OR …… |
| 2 | from | SELECT 1 FROM DUAL FROM是必须的 | SELECT 1 FROM 不是必须的 |
| 3 | like | NAME like 'a%' 大小写敏感,只查询以小写字母a开头的字符串 | NAME like 'a%' 大小写不敏感,查询以小写字母a或大写字母A开头的字符串 |
| 4 | 日期 | 根据时间参数查询: BIR_DAY = TO_DATE('2013-6-28', 'YYYY-MM-DD') OR BIR_DAY = TO_DATE('2013-06-26 17:02:29', 'YYYY-MM-DD HH24:MI:SS') __________________________当前日期时间:sysdate 转换函数:TO_DATE() TO_CHAR() | 根据时间参数查询: BIR_DAY ='2013/06/28 00:00:00' OR BIR_DAY ='2013/06/28' OR BIR_DAY ='2013-06-28' OR BIR_DAY=STR_TO_DATE ('2013-06-28 00:00:00', '%Y-%m-%d %H:%i:%s') -------------------- 当前日期时间:now() sysdate() 转换函数: str_to_date() date_format() |
| 5 | 分页(常用写法) | SELECT T2.* FROM (SELECT T1.*, ROWNUM RN FROM (SELECT * FROM TEST ORDER BY SID DESC) T1 WHERE ROWNUM < 5) T2 WHERE RN >= 1 | SELECT * FROM TEST_TEST1 ORDER BY SID DESC LIMIT 0,4 注:下标0开始 |
| 6 | 主键 | Oracle序列: SEQ_TEST.NEXTVAL SEQ_TEST.CURRVAL | Auto_increment属性实现自增获得唯一值。 last_insert_id()函数可获得自增列自动生成的最后一个编号。 注:Insert时可令该列为null/0/不写该列,则该属性自动填充。 |
| 7 | 字符串链接 | SELECT sid || username|| PASSWORD FROM TEST SELECT concat(concat(sid , username), password) FROM TEST | SELECT CONCAT(SID , USERNAME, PASSWORD) FROM TEST |
| 8 | 组函数用法 | SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP; 以上SQL不能正常执行,select后面的列必须是分组的列或者是用了聚合函数的列 | SELECT EMPNO,JOB, COUNT(1), SUM(SAL),SUM(COMM) FROM EMP; 随便分组都可以 |
| 9 | 分析函数 | row_number() over (partition by xx order by xx) rank() over (partition by xx order by xx) dense_rank() over (partition by xx order by xx) count(1) over() …… | Mysql没有直接支持 |
| 10 | 分区 | range分区、hash分区、list分区、 组合分区 | range分区、hash分区、list分区、 key分区、组合分区 |
| 11 | 索引 | 支持B树索引 | 支持B树索引 |
| 12 | 并行 | 支持 | 不明确 |
| 数据库对象 | oracle | mysql | |
| 1 | procedure | CREATE OR REPLACE PROCEDURE USP_UPD_TEST(P_NAME VARCHAR2, P_NEWSAL NUMBER) IS BEGIN UPDATE EMP SET SAL=P_NEWSAL WHERE ENAME=P_NAME; END; 说明: (1)建存储过程用create procedure XXX 或 create or replace procedure XXX 两种语法 (2)存储过程参数不能指定精度或长度,如P_NAME VARCHAR2 (3)参数后必须要有IS或AS (4)存储过程没有参数时,()必须省略 (5)变量定义在is和begin之间,如:v_name varchar2(200); | CREATE PROCEDURE USP_UPD_TEST (P_NAME VARCHAR(100),P_NEWSAL DECIMAL(7,2)) BEGIN UPDATE EMP SET SAL=P_NEWSAL WHERE ENAME=P_NAME; END; 说明: (1)建存储过程只能用create procedure XXX一种语法 (2)存储过程参数必须指定精度或长度,如P_NAME VARCHAR(100) (3)参数后不能有IS或AS (4)存储过程没有参数时必须保留() (5)变量定义在begin和end之间,如:declare v_name varchar(200); |
| 2 | view | 支持 | 支持 |
| 3 | Materialized view | 支持 | 无 |
| 4 | tigger | 1 包含DML触发器(INSERT触发器、DELETE触发器、UPDATE触发器三种)、替代触发器(视图)、系统触发器(系统的启动关闭等)。 2 支持语句级触发器和行级触发器 3 取新值时用:NEW.USERNAME 取旧值时用:OLD.USERNAME 4 CREATE TRIGGER TRIGGER_EMP AFTER INSERT OR UPDATE ON EMP FOR EACH ROW BEGIN 语句; END; 允许在一个trigger中,可以定义多个事件 5 调用存储过程时,如: CREATE OR REPLACE TRIGGER trigger_emp AFTER INSERT OR UPDATE ON emp FOR EACH ROW BEGIN USP_INS_EMP(); END; | 1 只有DML触发器(INSERT触发器、DELETE触发器、UPDATE触发器三种) 2 只支持行级触发器 3 取新值时用NEW.USERNAME 取旧值时用OLD.USERNAME 4 CREATE TRIGGER TRIGGER_EMP AFTER INSERT ON EMP FOR EACH ROW BEGIN 语句; END; 一个trigger中只能定义一个事件 5 调用存储过程时,如: CREATE TRIGGER TRIGGER_EMP2 AFTER UPDATE ON EMP2 FOR EACH ROW BEGIN CALL USP_INS_EMP(); END; |
| 5 | function | 支持 | 支持 |
| 6 | package | 支持 | 无 |
| 7 | job | 支持比较完善 | 支持比较简单,v5.1开始 |
| 8 | dblink | 支持 | 无 |
| 9 | sequence | 支持 | 无 |
| 10 | synonyms | 支持 | 无 |
| 11 | cursor | 1 静态游标(隐式游标,显示游标)、ref游标 2 支持loop循环,while循环,for循环 3 支持记录变量 4 支持bulk collection语法批量操作 LOOP -- 填充数据批量填充,每次读取2条. FETCH c_test_main BULK COLLECT INTO test_data LIMIT 2; … | 1 只支持静态游标 2 支持loop循环,repeat循环,while循环 3 不支持记录变量 4 只能单条操作 |
| 12 | 异常体系 | 支持 | 支持,但与oracle对异常处理方式差异比较大 |
MyISAM VS InnoDB性能测试:
| 数据量/单位:万 | MyISAM | InnoDB | 备注: my.cnf 特殊选项 |
| 插入:1w | 3秒 | 219秒 | innodb_flush_log_at_trx_commit=1 |
| 插入:10w | 29 秒 | 2092秒 | innodb_flush_log_at_trx_commit=1 |
| 插入:100w | 287秒 | N/A | innodb_flush_log_at_trx_commit=1 |
| 插入:1w | 3秒 | 3秒 | innodb_flush_log_at_trx_commit=0 |
| 插入:10w | 30秒 | 29秒 | innodb_flush_log_at_trx_commit=0 |
| 插入:100w | 273秒 | 423秒 | innodb_flush_log_at_trx_commit=0 |
| 插入:1w | N/A | 3秒 | innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M |
| 插入:10W | N/A | 26秒 | innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M |
| 插入:100W | N/A | 379秒 | innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=256M |
可以看出在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是
innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。
同时也可以看出值得使用 InnoDB 来替代 MyISAM 引擎来进行开发,毕竟InnoDB 有多数据库特性、更良好的数据存储性能和查询性能下载本文