测试结果总结如下:

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. LeetCode 258

    Add Digits Given a non-negative integer num, repeatedly add all its digits until the result has only ...

  2. 关于VMware桥接的注意事项

    VMware 使用桥接  想固定住虚拟机的IP的同时还可以访问外网. 通过Linux的可视化操作界面固定设置IP,网关,子网掩码等配置信息,如下图: 附录本地Windows中的IP地址信息: 虚拟机和 ...

  3. 【二进制】FZU 2062 Suneast & Yayamao

    题意:给出n,问最少需要多少个数字,这些数字能组成1~n的所有数: 分析:n=1; 1; 1个 n=2; 1,1;  2个 1 = 1; 2 = 1+1;   n=3; 1,2; 2个 1 = 1; ...

  4. Servlet & JSP - Listener

    Servlet API 中的 6 个事件类 1. ServletContextEvent:该类表示上下文事件,当应用上下文对象发生改变,例如创建或销毁上下文对象时,将触发上下文事件. 2. Servl ...

  5. Jersey(1.19.1) - Client API, Overview of the API

    To utilize the client API it is first necessary to create an instance of a Client, for example: Clie ...

  6. Redis - 发布/订阅模式

    Redis 提供了一组命令可以让开发者实现 “发布/订阅” 模式.“发布/订阅” 可以实现进程间的消息传递,其原理是这样的: “发布/订阅” 模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一 ...

  7. HDOJ2012素数判定

    素数判定 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. Linux命令(4):cat命令

    1.作用:连接并显示指定的一个和多个文件的有关信息: 2.格式:cat [选项] 文件1 文件2 ... 其中文件1.文件2为要显示的多个文件: 3.常见参数: 4.使用实例: [youname@ww ...

  9. 第十一篇、RxSwift

    三. 什么是函数式编程? 什么是函数式编程呢? 函数式编程其实是一种编程思想, 代码写出来只是它的表现形式. 在面向对象的编程思想中, 我们将要解决的一个个问题, 抽象成一个个类, 通过给类定义属性和 ...

  10. 技术博客rss订阅源收集

        http://blog.sina.com.cn/rss/2506410862.xml http://fullrss.net/a/http/www.cocoachina.com/cms/rss. ...