MySQL与Oracle主键Query性能测试结果
测试结果总结如下:
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性能测试结果的更多相关文章
- Mysql,SqlServer,Oracle主键自动增长的设置
1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); insert into customers ...
- MySQL 和 Oracle 主键自增长
1.MySQL 1)建表 auto_increment:每插入一条数据,客户表(customers)的主键id就自动增1,如下所示 create table customers -- 创建客户表 ( ...
- MySQL中的主键,外键有什么作用详解
MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...
- oracle 主键自动增长
oracle 主键自动增长 2009-12-11 16:07:00| 分类: 数据库资料|字号 订阅 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create tabl ...
- 关于MySQL自增主键的几点问题(上)
前段时间遇到一个InnoDB表自增锁导致的问题,最近刚好有一个同行网友也问到自增锁的疑问,所以抽空系统的总结一下,这两个问题下篇会有阐述. 1. 划分三种插入类型 这里区分一下几种插入数据行的类型,便 ...
- oracle主键自增
oracle主键自增 1建立数据表 create table Test_Increase( userid number(10) primary key, /*主键,自动增加*/ ...
- oracle 主键应用序列和触发器实现自动增长
oracle 主键自动增长 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null pr ...
- 设置MySQL数据表主键
设置MySQL数据表主键: 使用“primary key”关键字创建主键数据列.被设置为主键列不允许出现重复的值,很多情况下与“auto_increment”递增数字相结合.如下SQL语句所示: My ...
- Mysql 创建联合主键
Mysql 创建联合主键2008年01月11日 星期五 下午 5:21使用primary key (fieldlist) 比如: create table mytable ( ...
随机推荐
- JMS - 事务性消息
JMS 事务遵从发送操作与接收操作相互分离的约定.下图显示的是一个事务性发送,其中一组消息要么能够保证全部到达消息服务器,要么连一条消息也不能保证到达消息服务器.从发送者的角度来看,JMS 提供者为这 ...
- Git CMD - tag: Create, list, delete or verify a tag object signed with GPG
命令格式 git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] <tagname> [& ...
- HDOJ2013蟠桃记
蟠桃记 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Oracle学习第二天---Profile的使用
环境:Oracle 11g 一.权限的传递 1.如果传递的是对象权限,就在后面加入with grant option: eg:system用户有张temp的表,只想usertest用户拥有查询的权限, ...
- UIPickerView常见属性、常见方法(包括代理方法和数据源方法)的一些说明
一.UIPickerView 1.UIPickerView的常见属性 // 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id< ...
- dao层实现类的常见写法
记录下一个dao层类的写法,方便以后的使用. package com.bupt.auth.dao.impl; import java.util.ArrayList; import java.util. ...
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死. 所以程序中应该避免出现僵尸进程. 用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子 ...
- jQuery动态添加元素并绑定事件
写网页的时候常常需要根据实际情况添加新的元素,然后这些新元素还需要绑定已有的事件,如:有一ul,点击其中某 li,根据其 id 或 value 等获取新的数据列表,并新建 ul 显示,新 ul 中的 ...
- 暑假集训(4)第一弹 -----递推(Hdu2039)
题意梗概:fff团团员小A想退团了,不过要退团,他必须绘制出贤者法阵,以证明他有资格不受大fff之灵的监督 并退团,小A他现在要开始收集材料了,但是,他不清楚应该买多少份材料. 虽然你并不想帮他退团, ...
- 一次GC问题定位
同事有段代码执行时间过长,需要进行优化, Hashmultimap<Int,Bean> map = ...; for (400w*96) { // 计算过程 Bean = doComput ...