MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。

以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Oracle,DB2,后来全部转向Mysql,原因很简单:Mysql在性能不错的情况下,有着开源优势。Mysql的事务性与高性能是我们主要考虑的。后来,由于项目要用到用户系统,即会有大量的用户数据进行交互--海量存储,Mysql的读写速度会有一点瓶颈,于是我们就想到了最近发展很强势的Nosql。在Nosql早期的memcache的发展下,又出现了很多非关系型数据库,比如redis,mongodb。经过一段时间的测试,redis与mongodb的读写速度确实比Mysql有着很明显的优势。mongodb的写入速度大约2.5W/次每秒。

mongodb以BSON结构(二进制)进行存储,对海量数据存储有着很明显的优势。下面是Mongodb与Mysql的操作命令的对比。

作用

  1. MySQL
  2.  
  3. MongoDB

服务器守护进程

  1. mysqld
  2.  
  3. mongod

客户端工具

  1. mysql
  2.  
  3. mongo

逻辑备份工具

  1. mysqldump
  2.  
  3. mongodump

逻辑还原工具

  1. mysql
  2.  
  3. mongorestore

数据导出工具

  1. mysqldump
  2.  
  3. mongoexport

数据导入工具

  1. source
  2.  
  3. mongoimport

新建用户并授权

  1. grant all on *.* to username@'localhost' identified by 'passwd';
  2. db.addUser("user","psw") db.auth("user","psw")
显示库列表

  1. show databases;
  2.  
  3. show dbs

进去库

  1. use dbname;
  2.  
  3. use dbname

显示表列表

  1. show tables;
  2.  
  3. show collections

查询主从状态

  1. show slave status;
  2.  
  3. rs.status

创建库

  1. create database name;
  2.  
  3. 无需单独创建,直接use进去

创建表

  1. create table tname(id int);
  2.  
  3. 无需单独创建,直接插入数据

删除表

  1. drop table tname;
  2.  
  3. db.tname.drop()

删除库

  1. drop database dbname;
  2.  
  3. 首先进去该库,db.dropDatabase()

插入记录

  1. insert into tname(id) value(2);
  2.  
  3. db.tname.insert({id:2})

删除记录

  1. delete from tname where id=2;
  2.  
  3. db.tname.remove({id:2})

修改/更新记录

  1. update tname set id=3 where id=2;
  2.  
  3. db.tname.update({id:2}, {$set:{id:3}},false,true)

查询所有记录

  1. select * from tname;
  2.  
  3. db.tname.find()

查询所有列

  1. select id from tname;
  2.  
  3. db.tname.find({},{id:1})

条件查询

  1. select * from tname where id=2;
  2.  
  3. db.tname.find({id:2})

条件查询

  1. select * from tname where id < 2;
  2.  
  3. db.tname.find({id:{$lt:2}})

条件查询

  1. select * from tname where id >=2;
  2.  
  3. db.tname.find({id:{$gte:2}})

条件查询

  1. select * from tname where id=2 or name='steve';
  2.  
  3. db.tname.find($or:[{id:2}, {name:'steve'}])

条件查询

  1. select * from tname limit 1;
  2.  
  3. db.tname.findOne()

模糊查询

  1. select * from tname where name like "%ste%";
  2.  
  3. db.tname.find({name:/ste/})

模糊查询

  1. select * from tname where name like "ste%";
  2.  
  3. db.tname.find({name:/^ste/})

获取表记录数

  1. select count(id) from tname;
  2.  
  3. db.tname.count()

获取有条件 的记录数

  1. select count(id) from tname where id=2;
  2.  
  3. db.tname.find({id:2}).count()

查询时去掉 重复值

  1. select distinct(last_name) from tname;
  2.  
  3. db.tname.distinct('last_name')

正排序查询

  1. select *from tname order by id;
  2.  
  3. db.tname.find().sort({id:1})

逆排序查询

  1. select *from tname order by id desc;
  2.  
  3. db.tname.find().sort({id:-1})

取存储路径

  1. explain select * from tname where id=3;
  2.  
  3. db.tname.find({id=3}).explain()

特别要注意的是:mongodb插入多个字段语法

  1. > db.user.insert({id:1,name:'steve',sex:'male'}) 正确
  2.  
  3. > db.user.insert({id:2},{name:'bear'},{sex:'female'}) 错误

Mysql与MongoDB对比测试

  1. 来源:http://blog.csdn.net/e421083458/article/details/8849247
  2.  
  3. 测试环境:php5.2mysql5.0MongoDB2.0.6xbug测试脚本:Mysql测试脚本:

测试

  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. $con=mysql_connect("localhost","root","123456");
  4. if(!$con)
  5. {
  6. die('Couldnotconnect:'.mysql_error());
  7. }
  8. mysql_select_db("my_test",$con);
  9. mysql_query("setnamesutf8");
  10. $time1=xdebug_time_index();//测试单条插入
  11. for($i=1;$iadmin;
  12. //定制结果集(表名things)
  13. $collection=$db->members;
  14. $time1=xdebug_time_index();//测试单条插入
  15. for($i=1;$i'chuchuchu_'.$i,'name'=>'褚褚褚','password'=>'e10adc3949ba59abbe56e057f20f883e','email'=>'dhaig@yahoo.com.cn');
  16. $collection->insert($user);
  17. }
  18. //测试单条查询
  19. $cursor=$collection->find()->limit(1);
  20. //while($cursor->hasNext())
  21. //{
  22. //var_dump($cursor->getNext());
  23. //}
  24. //测试更新
  25. $newdata=array('$set'=>array("email"=>"test@test.com"));
  26. $collection->update(array("uname"=>"chuchuchu_1"),$newdata);//测试删除
  27. $collection->remove(array('email'=>'dhaig@yahoo.com.cn'),array("justOne"=>true));
  28. //测试100万条数据插入
  29. for($i=1;$i'chuchuchu_'.$i,'name'=>'褚褚褚','password'=>'e10adc3949ba59abbe56e057f20f883e','email'=>'dhaig@yahoo.com.cn');
  30. $collection->insert($user);
  31. }
  32. //测试100万数据之单条插入
  33. $user=array('uname'=>'chuchuchu_0','name'=>'褚褚褚','password'=>'e10adc3949ba59abbe56e057f20f883e','email'=>'dhaig@yahoo.com.cn');
  34. $collection->insert($user);
  35. //测试100万数据之单条查询
  36. $user=$collection->findOne(array('uname'=>'chuchuchu_0'));
  37. var_dump($user);
  38. //测试100万数据之单条更新
  39. $newdata=array('$set'=>array("email"=>"test@test.com"));
  40. $collection->update(array("uname"=>"chuchuchu_0"),$newdata);
  41. var_dump($user);
  42. //测试100万数据之单条删除
  43. $collection->remove(array('uname'=>'chuchuchu_0'),array("justOne"=>true));$conn->close();
  44. $time2=xdebug_time_index();
  45. echo"MongoDB响应时间为:".($time2-$time1)."秒";
  46. ?>

本测试原则:如果比较结果相近,则扩大数量级。如比较结差距大,则采用最小数量级。

1.测试插入:
单条数据操作
时间:
Mysql响应时间为:0.00045895576477051秒
MongoDB响应时间为:0.00031495094299316秒
100条数据操作
Mysql响应时间为:0.014914989471436秒
MongoDB响应时间为:0.010399103164673秒
1000条数据操作
Mysql响应时间为:0.17900490760803秒
MongoDB响应时间为:0.096189975738525秒
100万条数据操作Mysql响应时间为:168.32936501503秒
MongoDB响应时间为:87.314424991608秒
测试100万数据之后单条插入:
Mysql响应时间为:0.00042891502380371秒
MongoDB响应时间为:0.00025105476379395秒

分析: 在查询方面数量级越大相应时间差距越大。100万数据测试中mongo要比mysql至少快2倍。MongoDB要比Mysql有优势。

2.测试查询:
单条数据操作
时间:
Mysql响应时间为:0.00082182884216309秒
MongoDB响应时间为:0.00055313110351562秒
100条数据操作
Mysql响应时间为:0.00066590309143066秒
MongoDB响应时间为:0.00087094306945801秒
1000条数据操作
Mysql响应时间为:0.002295970916748秒
MongoDB响应时间为:0.00048995018005371秒
测试100万数据之后单条查询:
Mysql响应时间为:0.0011050701141357秒
MongoDB响应时间为:0.00045204162597656秒

分析: 在测试中我们发现,当100条以内查询时mysql优于mongodb但是当操作数据100万后mongodb要比mysql快至少3倍。

3.测试更新:
测试100万数据之前操作:
Mysql响应时间为:0.00034689903259277秒MongoDB响应时间为:0.00021195411682129秒
测试100万数据之后操作:
Mysql响应时间为:0.00043201446533203秒
MongoDB响应时间为:0.0011470317840576秒

分析: 100万数据之后,Mysql在更新方面要比MongoDB的速度快3倍。

4.测试删除:
单条删除操作:
Mysql响应时间为:0.00081205368041992秒MongoDB响应时间为:0.00023102760314941秒
多条删除操作:Mysql响应时间为:0.00092816352844238秒
MongoDB响应时间为:0.0092201232910156秒
测试100万数据之后单条删除操作:
Mysql响应时间为:0.00066685676574707秒
MongoDB响应时间为:0.0011069774627686秒

分析: 100万数据之后,Mysql在更新方面要比MongoDB的速度快2倍。总结:MongoDB在数据插入及查询上性能表现优异,MongoDB拥有处理大型数据的能力。

MySQL 与 MongoDB的操作对比的更多相关文章

  1. MySQL与MongoDB的操作对比,以及区别

    MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...

  2. [转]MySQL与MongoDB的操作对比

    MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...

  3. MySQL与MongoDB的操作对比

    MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方 ...

  4. 1.MySQL与MongoDB的操作对比,以及区别

    转自:https://www.cnblogs.com/chris-oil/p/4982490.html MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoD ...

  5. MySQL与MongoDB的区别

    一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨 ...

  6. 从MySQL和MongoDB的对比,看SQL与NoSQL的较量

    张家江,网易乐得高级工程师. 贵金属(注:贵金属为笔者部门业务)的行情系统提供的接口通过Redis获取数据,目前使用Redis最多只存储了大概8000条左右的分钟k的行情数据,考虑到将来可能会有更大数 ...

  7. MySQL和Mongodb的区别与应用场景对比

    MySQL是关系型数据库 优势: 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点 ...

  8. Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比

    对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...

  9. mongoDB 数据库操作

    mongoDB 数据库操作 数据库命名规则 . 使用 utf8 字符,默认所有字符为 utf8 . 不能含有空格 . / \ "\0" 字符 (c++ 中会将 "\0&q ...

随机推荐

  1. 基于spark1.4的Spark-Sql

    Author: kwu 基于spark1.4的Spark-Sql,spark1.4.1在7月15刚公布.提供较好sql支持 1.怎样启动Spark-Sql 启动脚本例如以下 #!/usr/bin/en ...

  2. c19---指针和字符串

    // // main.c // 指针和字符串 // // Created by xiaomage on 15/6/14. // Copyright (c) 2015年 xiaomage. All ri ...

  3. android 系统签名【转】

    本文转载自:http://blog.csdn.net/csh86277516/article/details/73549824 Android——编译release版签名系统 AndroidManif ...

  4. linux中udev简单的用法-->【转】

    本文转载自:http://blog.csdn.net/qq_29729577/article/details/50825134 udev是Linux提供的一种在用户态管理设备的一种机制,udev的详细 ...

  5. iOS10 推送通知 UserNotifications

    简介 新框架 获取权限 获取用户设置 注册APNS,获取deviceToken 本地推送流程 远程推送流程 通知策略(Category+Action) 附件通知 代理回调 简介 iOS10新增了Use ...

  6. (hdoj 5137 floyd)How Many Maos Does the Guanxi Worth

    How Many Maos Does the Guanxi Worth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/5 ...

  7. javascript定义类或对象的方式

    本文介绍的几种定义类或对象的方式中,目前使用最广泛的是:混合的构造函数/原型方式.动态原型方式.不要单独使用经典的构造函数或原型方式. 工厂方式 构造器函数 原型方式 混合的构造函数/原型方式 动态原 ...

  8. ps -aux ,ps aux ,ps -ef 的区别

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  9. 实现第三方登录(QQ、微信、微博)

    第三方登录,就是使用大家比较熟悉的比如QQ.微信.微博等第三方软件登录自己的网站,这可以免去注册账号.快速留住用户的目的,免去了相对复杂的注册流程.下边就给大家讲一下怎么使用PHP开发QQ登录的功能. ...

  10. Oracle---显式游标

    一  游标的分类 在Oracle中提供了两种类型的游标:静态游标和动态游标. 1.静态游标是在编译时知道其SELECT语句的游标.静态游标又分为两种类型,即隐式游标和显式游标. 2.当用户需要为游标使 ...