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 ( ...
随机推荐
- 显示创建一个表的SQL语句
显示创建数据库中包的语句,从而可以方便的对表的结构进行修改和复制(当然还有其他的方式) 显示表结构: 显示创建表语句: show create table tablename;
- Eclipse遇到Initializing Java Tooling解决办法
可参考博客:http://liaojuncai.iteye.com/blog/1954113 打开Eclipse的时候莫名其妙的出现这个错误,进度条一直显示这个提示Initializing java ...
- hdu 4605 线段树与二叉树遍历
思路: 首先将所有的查询有一个vector保存起来.我们从1号点开始dfs这颗二叉树,用线段树记录到当前节点时,走左节点的有多少比要查询该节点的X值小的,有多少大的, 同样要记录走右节点的有多少比X小 ...
- Android中定义接口的方法
1.接口方法用于回调(这里定义接口是为了使用其接口方法): public interface ICallback { public void func(); } public class Caller ...
- Commons CLI - Usage
Usage Scenarios The following sections describe some example scenarios on how to use CLI in applicat ...
- 参数请求post, get , delete中的基本使用(1)
/// <summary> /// get 数据的时候可以采用此函数大部分功能 /// </summary> /// <param name="args&quo ...
- JavaBean在JSP中显示时间
创建DateTimeBean的类,将其放置于org.caiduping.bean的包中,实现时间,星期的封装. package org.caiduping.bean; import java.text ...
- mysql补集合计算
mysql补集计算方法: 两表是1对多关系,user_id是关联字段,两表的数据量都是千万级别的 子查询实现 select count(*),sum(total_money) from A ...
- 对C#调用C++ dll文件进行总结
在实际项目工作中,经常用到C#调用C++ 或者C编写的dll文件. dll支持一般函数声明和类的定义声明,但是一般为了简化,都是 采用函数声明的方式.这里主要并不是写 dll的编写. 先在vs中创建一 ...
- poj 1077 Eight(A*)
经典的八数码问题,用来练习各种搜索=_=.这题我用的A*做的,A*的主要思想就是在广搜的时候加了一个估价函数,用来评估此状态距离最终状态的大概距离.这样就可以省下很多状态不用搜索.对于每个状态设置一个 ...