将Excel文件的数据导入到MongDB
命令:mongoimport –host localhost –db test –collection test –type csv –file ip.csv –headerline –upsert
官方文档:http://www.mongodb.org/display/DOCS/Import+Export+Tools
400W记录在Mongodb中的性能测试
环境:
MongoDB: Ver1.8.3
OS: Windows 2003标准版
CPU: T2250, 1.73GHz,降频至800MHz
内存:1GB
硬盘:5400转80GB
1.采用 for(var i=1000000000;i<1004000000;i++)db.test.insert({id:i,ip_from:i,ip_to:i+1}) 插入400W的记录
2.在ip_from与ip_to字段上创建组合索引
3.使用db.test.find({ip_from:{$gt:1003000493},ip_to:{$lt:1003000520}}).limit(50) 进行查询
4.当查询结果记录匹配数有40条记录,显示40条全部记录时,查询耗时6040ms,当显示1至39条记录时,查询耗时10ms内
5.实在不明白为什么显示结果跟它有这么大的差异?
MongDB创建索引
1.单列索引
在字段x上创建索引,1 (ascending) or -1 (descending)
db.data.ensureIndex({x:1})
2.组合索引
db.data.ensureIndex({name: 1, info: -1})
显示表data上的所有索引
db.data.getIndexes()
3.删除索引
db.data.dropIndex({x: 1, y: -1})
[转]Mysql/Sql server与Mongodb查询
MySQL中的常用SQL语句在MongoDB中的写法,如果你长期使用MySQL而对MongoDB跃跃欲试,这篇简单的文章可以帮助你更快的进入角色。
查询:
MySQL:
SELECT * FROM user
Mongo:
db.user.find()
MySQL:
SELECT * FROM user WHERE name = ‘starlee’
Mongo:
db.user.find({‘name’ : ‘starlee’})
插入:
MySQL:
INSERT INOT user (`name`, `age`) values (‘starlee’,25)
Mongo:
db.user.insert({‘name’ : ‘starlee’, ‘age’ : 25})
如果你想在MySQL里添加一个字段,你必须:
ALTER TABLE user….
但在MongoDB里你只需要:
db.user.insert({‘name’ : ‘starlee’, ‘age’ : 25, ‘email’ : ‘starlee@starlee.com’})
删除:
MySQL:
DELETE * FROM user
Mongo:
db.user.remove({})
MySQL:
DELETE FROM user WHERE age < 30
Mongo:
db.user.remove({‘age’ : {$lt : 30}})
$gt : > ; $gte : >= ; $lt : < ; $lte : <= ; $ne : !=
更新:
MySQL:
UPDATE user SET `age` = 36 WHERE `name` = ‘starlee’
Mongo:
db.user.update({‘name’ : ‘starlee’}, {$set : {‘age’ : 36}})
MySQL:
UPDATE user SET `age` = `age` + 3 WHERE `name` = ‘starlee’
Mongo:
db.user.update({‘name’ : ‘starlee’}, {$inc : {‘age’ : 3}})
MySQL:
SELECT COUNT(*) FROM user WHERE `name` = ‘starlee’
Mongo:
db.user.find({‘name’ : ‘starlee’}).count()
MySQL:
SELECT * FROM user limit 10,20
Mongo:
db.user.find().skip(10).limit(20)
MySQL:
SELECT * FROM user WHERE `age` IN (25, 35,45)
Mongo:
db.user.find({‘age’ : {$in : [25, 35, 45]}})
MySQL:
SELECT * FROM user ORDER BY age DESC
Mongo:
db.user.find().sort({‘age’ : -1})
MySQL:
SELECT DISTINCT(name) FROM user WHERE age > 20
Mongo:
db.user.distinct(‘name’, {‘age’: {$lt : 20}})
MySQL:
SELECT name, sum(marks) FROM user GROUP BY name
Mongo:
db.user.group({
key : {‘name’ : true},
cond: {‘name’ : ‘foo’},
reduce: function(obj,prev) { prev.msum += obj.marks; },
initial: {msum : 0}
});
MySQL:
SELECT name FROM user WHERE age < 20
Mongo:
db.user.find(‘this.age < 20′, {name : 1})
发现很多人在搜MongoDB循环插入数据,下面把MongoDB循环插入数据的方法添加在下面:
for(var i=0;i<100;i++)db.test.insert({uid:i,uname:’nosqlfan’+i});
上面一次性插入一百条数据,大概结构如下:
{ “_id” : ObjectId(“4c876e519e86023a30dde6b8″), “uid” : 55, “uname” : “nosqlfan55″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6b9″), “uid” : 56, “uname” : “nosqlfan56″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6ba”), “uid” : 57, “uname” : “nosqlfan57″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bb”), “uid” : 58, “uname” : “nosqlfan58″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bc”), “uid” : 59, “uname” : “nosqlfan59″ }
{ “_id” : ObjectId(“4c876e519e86023a30dde6bd”), “uid” : 60, “uname” : “nosqlfan60″ }
Solr 3.3使用group进行分组查询时的bug
1.使用group.main后,无法使用start参数,使用start的起始数字超过rows的数字时,始终没有查询结果列表,但numberFound是有数据的,该Bug在3.4中已经解决
2.使用group后,无法查询过滤重复记录后的记录总数,始终返回的是未排除重复记录的总数,这个感觉不太合理,已经在用户论坛提出来,目前未解决
Solr 3.x最新动态地址: https://builds.apache.org/job/Solr-3.x/
Solr用户论坛:http://lucene.472066.n3.nabble.com/Solr-User-f472068.html
直接删除新 solrconfig.xml 配置文件中的 QueryElevationComponent 节点即可解决
使用Memcached性能调优的几种方法
1.缓存耗时的SQL结果
2.缓存页面中for ,next等大批量的循环
3.使用getbulk方法,批量获取key/value,减少memcached连接
4.实时监控memcached运行状态,内存使用率不要超过85%,否则命中率会严重降低
5.合理设置memcached超时时间,防止网络原因引起的连接超时导致性能下降
在我们的生产环境发现,在采用SQl Server 2008时,对表中的一nvarchar字段进行主键查询,居然耗时500ms左右,实在难以忍受,通过不断的测试,同是nvarchar字段但是长度为50的nvarchar只需要4ms左右,遂将nvarchar(30)–>nvarchar(50)速度立即提升到4ms。
估计这是Coldfusion9数据连接里面的一个bug(经测试直接用查询分析器,同样的SQL,查询速度亦非常的快!)
利用Facebook lint 帮助API快速开发
最近与同事做Facebook share API开发的时候,发现Share 过后的URL在统计的时候并没有实时展示出来,或是直接统计结果为0,最后才知道,原来是页面中的 <link rel=”canonical” href=”http://www.abc.com/abc.html”> 在作怪,最开始一直没有找到原因,是通过Facebook lint的帮助才发现,lint还有很多实用的功能,http://developers.facebook.com/tools/lint/
设置document.domain属性,解决iframe跨域问题
假如有这样一个需求:
domain: a.xxx.com页面调用 domain: b.xxx.com的上传页面,b.xxx.com上传成功上传文件后执行a.xx.com的js代码。直接使用是会报js错的,“拒绝访问”,这是因为浏览器不允许跨域访问。
解决方法:在a.xxx.com以及b.xxx.com中的页面同时设置 document.domain=”xxx.com”; 就可以解决此问题了。
需要注意的是:document.domain中的域名值只能是比当前域名同级或更高一级(如:a.xxx.com可以设置为xxx.com和a.xxx.com),不能设置为 b.xxx.com以及yyy.com