今天在同事那里看到了一个很不错的MongoDB的客户端工具MongoVue,地址是http://www.mongovue.com/。做的不错,1.0版本的开始收费了,费用也不贵才35$。真正需要的同学可以掏点钱买个吧,也算是支持这个工具,如果只是学习研究用的话我这里还有一个0.9.7版本,虽然比起1.0版来说有些bug,平常使用也够了,需要的同学可以单独联系我。 1.0版之后超过15天后功能受限。可以通过删除以下注册表项来解除限制: [HKEY_CURRENT_USER\Software\Classes\CLSID\{B1159E65-821C3-21C5-CE21-34A484D54444}\4FF78130] 把这个项下的值全删掉就可以了。
Browsing the archives for the MongoDB tag
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是Mongo Database Profiler.不仅有,而且还有一些比MySQL的Slow Query Log更详细的信息。它就是我们这篇文章的主题。 开启 Profiling 功能 有两种方式可以控制 Profiling 的开关和级别,第一种是直接在启动参数里直接进行设置。 启动MongoDB时加上–profile=级别 即可。 也可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置。可以通过db.getProfilingLevel()命令来获取当前的Profile级别。
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高 3) 安全插入功能 (确保插入成功,使用的是SafeMode.True开关),这个测的是安全插入性能会差多少 4) 查询一个索引后的数字列,返回10条记录(也就是10KB)的性能,这个测的是索引查询的性能 5) 查询两个索引后的数字列,返回10条记录(每条记录只返回20字节左右的2个小字段)的性能,这个测的是返回小数据量以及多一个查询条件对性能的影响 6) 查询一个索引后的数字列,按照另一个索引的日期字段排序(索引建立的时候是倒序,排序也是倒序),并且Skip100条记录后返回10条记录的性能,这个测的是Skip和Order对性能的影响 7) 查询100条记录(也就是100KB)的性能(没有排序,没有条件),这个测的是大数据量的查询结果对性能的影响 8) 统计随着测试的进行,总磁盘占用,索引磁盘占用以及数据磁盘占用的数量 并且每一种测试都使用单进程的Mongodb和同一台服务器开三个Mongodb进程作为Sharding(每一个进程大概只能用7GB左右的内存)两种方案 其实对于Sharding,虽然是一台机器放3个进程,但是在查询的时候每一个并行进程查询部分数据,再有运行于另外一个机器的mongos来汇总数据,理论上来说在某些情况下性能会有点提高
mongodb索引规则基本上与传统的关系库一样,大部分优化MySQL/Oracle/SQLite索引的技巧也适用于mongodb。 一、 为什么用索引: 当查询中用到某些条件时,可以对该键建立索引,以提高查询速度。 如果数据量很多且查询多于更新时,可以用索引提高查询的速度。 二、 索引管理: a) 查询索引: 查询已有索引的明细: 查询索引很简单,比如说需要查询mailaccess数据库中的Mail collection上的索引时: mongo 进入mongo MongoDB shell version: 1.8.1 connecting to: test > use mailaccess 进入mailaccess database switched to db mailaccess > db.Mail.getIndexes() 查询索引明细 [ { "name" : "_id_", "ns" : "mailaccess.Mail", "key" : { "_id" : 1 }, "v" : 0 }, { "_id" : [...]
最近trunk.ly的工程师通过mongostat发现了大量的page fault,然后通过检查发现,他们的索引已经超出内存限制了(没有keep all index in RAM)。于是他们决定开始减小索引大小,通过测试得出了如下的数据,不同的数据类型的索引大小有2到3倍的差距。 虽然能够想像得到,但是直观的数据图可能让我们更深刻的认识到。他们的测试再一次告诉我们:给索引定一个好的数据结构是多么重要。 这是测试结果图,分别是用int、MongoDB的ObjectID、base64和md5的字符串做索引产生的索引大小: 测试过程也非常简单,首先用下面脚本将各种不同数据结构的数据写入到不同的collection里: #!/usr/bin/env python import pymongo import bson from pymongo import Connection db = connection.test_database print('ObjectID') for i in range(1, 1000000): db.objectids.insert({'i': i}) print('int') for i in range(1, 1000000): db.ints.insert({'_id': i, 'i': i}) print('Base64 BSON') for i in range(1, 1000000): db.base64s.insert({'_id': \ bson.Binary(hashlib.md5(str(i)).digest(), bson.binary.MD5_SUBTYPE), 'i': i}) print('string') for [...]
一.mongodb的监控 mongostat是mongdb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。 它的输出有以下几列: inserts/s 每秒插入次数 query/s 每秒查询次数 update/s 每秒更新次数 delete/s 每秒删除次数 getmore/s 每秒执行getmore次数 command/s 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令 flushs/s 每秒执行fsync将数据写入硬盘的次数。 mapped/s 所有的被mmap的数据量,单位是MB, vsize 虚拟内存使用量,单位MB res 物理内存使用量,单位MB faults/s 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展 locked % 被锁的时间百分比,尽量控制在50%以下吧 idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了 q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。 conn 当前连接数 time 时间戳 二.mongodb的优化 mongodb可以通过profile来监控数据,进行优化。
有点标题党的意思,不过下面三招确实比较实用,内容来自Conversocial公司的VP Colin Howe在London MongoDB用户组的一个分享。 申请:下面几点并非放四海皆准的法则,具体是否能够使用,还需要根据自己的应用场景和数据特点来决定。 1.使用组合式的大文档 我们知道MongoDB是一个文档数据库,其每一条记录都是一个JSON格式的文档。比如像下面的例子,每一天会生成一条这样的统计数据: { metric: "content_count", client: 5, value: 51, date: ISODate("2012-04-01 13:00") } { metric: "content_count", client: 5, value: 49, date: ISODate("2012-04-02 13:00") } 而如果采用组合式大文档的话,就可以这样将一个月的数据全部存到一条记录里: { metric: "content_count", client: 5, month: "2012-04", 1: 51, 2: 49, ... } 通过上面两种方式存储,预先一共存储大约7GB的数据(机器只有1.7GB的内存),测试读取一年信息,这二者的读性能差别很明显:
1.客户端常用命令 #mongo >help //列出帮助 >db.help() //db级别的帮助 >db.mycollection.help() //collection 级别的帮助 常用命令: >show dbs //show database names >show collections //show collections in current database >use <db_name> //set current database >db.foo.find() //list objects in collection foo >db.foo.find({a:1}) //list objects in foo where a == 1 >db.createCollection(name, { size : ..., capped : ..., max : ... } ) //创建collection >db.dropDatabase() //删除库 >db.collection.count() //统计colleciton的数量 >db.collection.drop() //删除此colleciton >db.foo.find().count //某个数据的数量 >db.collection.find(...).limit(n) MongoDB与MySQL的对应关系如下表所示:
在上文中,我们了解了教你如何利用MySQL学习MongoDB之授权和权限,本文中我们继续我们的学习之旅,学习两者的导入和导出。 1、MySQL导入和导出 (1)、mysqlimport 此工具位于mysql/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件student.txt中把数据导入到数据库class中的表 student中: mysqlimport class.student student.txt (2)、load data infile 这个命令与mysqlimport非常相似,但这个方法可以在MySQL命令行中使用。 如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令: Load data local infile "d:\student.txt" into table student;