测试结果总结如下:

1. 按主键读:SQL形式:SELECT * FROM table WHERE id=?。

1.1. 主键为数字。如果所有ID均不存在,纯比较SQL解析能力。MySQL解析SQL的速度约是Oracle的2倍。原因在于MySQL优化器代码简单,动态规划的深度限制为64层,能较好的控制解析SQL的时间。

1.2. 主键为数字。如果所有ID均存在,且完全随机分布。低并发(<=16)时MySQL的每秒处理查询数(QPS)落后Oracle 30%左右,并发量增大后(>=32),落后Oracle一半左右。

1.3. 主键为数字。如果所有ID均存在,ID随机范围控制在一定范围。(ID 在 [minID, maxID] 范围内)随着ID范围的缩小,实际访问的数据就越小,重复读到一条数据的概率增高,多次测试后,MySQL与Oracle的差距在减小,当控制的范围数据约等于InnoDB Buffer Pool的大小时,与Oracle的差距不再明显。减少数据量的测试结果也基本相似,数据量减小到约等于MySQL Buffer Pool的大小时,与Oracle的差距较小。由此可以判断,MySQL的缓存替换算法较Oracle存在一定的差距。InnoDB的预读准确率没有Oracle高,所以当数据量减少的时候,Oracle的预读准确率并不会有太大的提高,但是InnoDB随着数据量的减少,预读的准确性就会有较大的提升。

1.4. 主键为字符串。Oracle的效率和MySQL差距缩小,低并发时MySQL还略高于Oracle。同比MySQL主键为数字和字符串时,查询性能差距比较小,主键为字符串效率略低与数字主键。Oracle差距则很大,浮动最大达50%。

2. 随机插入:SQL形式:INSERT INTO table (col) VALUES (?);

2.1. 主键为数字自增。

低并发(<=16)插入时,效率基本没有差异,当并发量提高 (>=32)时,MySQL的插入效率明显下降,Oracle采用序列,默认情况下插入速度高于MySQL,并发量提高这个差距越扩大。原因在于,Oracle的序列有自己的锁,不与表的锁混用,MySQL默认情况下,自增的锁与表锁合一,每次获取自增值都回带来一次表锁,这会严重的限制并发量。同时MySQL开启了binlog,这会比Oracle带来更多的日志记录,除了undo log/redo log,还多了binlog。但是MySQL InnoDB在5.1版本中提供了一个innodb_autoinc_lock_mode参数,如果设置为0,则出现上述情况,如果设置为1,采用 Auto_increment 独立的轻量锁,则效果改善很多,高并发时(>=32)与Oracle也基本本没有差距,在5%左右,到128依然没有明显的差距。

2.2. 主键为字符串时。

字符串无需的情况下,MySQL的插入效率明显下降,低并发时(<=16)下降约为30%,高并发时(>=32)可以达到50%。Oracle则变化不大。原因在于,MySQL InnoDB的主键和数据是一起的,如果主键无序插入,每次插入都会带来主键索引的调整,这是一笔非常大的开销。即使字符串有序插入,由于字符串占用长度大于数字,存取主键的开销会略大,较数字主键依然会有15%左右的性能差据。

3. 随机更新:SQL形式:UPDATE SET col=xxx WHERE ID=?;

无论主键为数字或者字符串,MySQL的更新效率都要高于Oracle。数字主键时,低并发时(<=16)效率高15%左右,高并发时(>=32)效率高10%左右。字符串主键时,在数字主键上再提高5%左右,MySQL在处理字符串主键时比Oracle效率高。原因在于MySQL的轻量,UPDATE只需要一个主键行锁,更新主键索引即可,没有任何主键位置的变动,也不需要回表访问数据块,所以效率较高。

总的来说,MySQL轻量、InnoDB的聚集索引,适合在简单的业务场景使用,性能并不逊于Oracle。存在复杂的SQL,高并发场景,MySQL单实例性能是逊于Oracle的,但是没有事务的情况下依靠分库,可以化解这些问题。但是复杂业务逻辑、高并发的事务处理,并不适合MySQL,Oracle更适合这种场景。

MySQL和Oracle都有自己适合的地方,合适的就是最好的。

MySQL与Oracle主键Query性能测试结果的更多相关文章

  1. Mysql,SqlServer,Oracle主键自动增长的设置

    1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); insert into customers ...

  2. MySQL 和 Oracle 主键自增长

    1.MySQL 1)建表 auto_increment:每插入一条数据,客户表(customers)的主键id就自动增1,如下所示 create table customers -- 创建客户表 ( ...

  3. MySQL中的主键,外键有什么作用详解

    MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...

  4. oracle 主键自动增长

    oracle 主键自动增长 2009-12-11 16:07:00|  分类: 数据库资料|字号 订阅     这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create tabl ...

  5. 关于MySQL自增主键的几点问题(上)

    前段时间遇到一个InnoDB表自增锁导致的问题,最近刚好有一个同行网友也问到自增锁的疑问,所以抽空系统的总结一下,这两个问题下篇会有阐述. 1. 划分三种插入类型 这里区分一下几种插入数据行的类型,便 ...

  6. oracle主键自增

    oracle主键自增 1建立数据表 create table Test_Increase(            userid number(10) primary key,  /*主键,自动增加*/ ...

  7. oracle 主键应用序列和触发器实现自动增长

    oracle 主键自动增长 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null pr ...

  8. 设置MySQL数据表主键

    设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...

  9. Mysql 创建联合主键

    Mysql 创建联合主键2008年01月11日 星期五 下午 5:21使用primary key (fieldlist)      比如:   create table mytable (       ...

随机推荐

  1. 数据库SQL优化大总结之百万级数据库优化方案

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  2. spark集成hive遭遇mysql check失败的问题

    问题: spark集成hive,启动spark-shell或者spark-sql的时候,报错: INFO MetaStoreDirectSql: MySQL check failed, assumin ...

  3. python学习day2--python基础

    python没有常量的定义方式,一般常量可人为用全部大写字母来表示. 如: MYSQL_CONNECTION='192.168.10.2' 以os库为例: import os os.system('i ...

  4. 实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

    在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:virtual void BeginContact ...

  5. Cocos2d-x中自定义粒子系统

    除了使用Cocos2d-x的11种内置粒子系统外,我们还可以通过创建ParticleSystemQuad对象,并设置属性实现自定义粒子系统,通过这种方式完全可以实现我们说需要的各种效果的粒子系统.使用 ...

  6. Page 的生命周期学习小结(翻译兼笔记)

    初始化(Initialization) 页面被请求时,第一个被执行的总是下面接着执行的是 接着是 然后是 恢复和加载(Restore and Load) 接下来的 ViewState 被取回后,接着  ...

  7. C++ 宽字符(wchar_t)与窄字符(char)的转换

    了解 长度 宽字符wchar_t的长度16位,可以用来显示中文等除英文外的其他文字, 窄字符    char   的长度  8 位,只能处理英文. 哪里可以见到 在VS2010, 2012, 2013 ...

  8. 《SELinux安全上下文的管理(含图)》RedHat6.3——步骤详细、条理清晰

    1.为什么浏览器只识别/var/www/html下的文件? 2.为什么不识别别的目录下的index.html文件呢? 3.这里牵扯到身份证,先安装软件包. 4.打开selinux 5.建立一个新的目录 ...

  9. DevExpress gridLookUpEdit 实现多选

    一:创建类GridCheckMarksSelection   #region Fileds RepositoryItemGridLookUpEdit _currentRepository; prote ...

  10. RequireJS的简单应用

    一.RequireJS的主要作用与优点 主要作用:js模块化.编写复用js代码 优点: 1.防止命名冲突 2.声明不同js文件之间的依赖 3.代码模块化 (1)一个文件一个模块:每个js文件应该只定义 ...