与Python的sqlite3模块相比,Node-sqlite3似乎很慢

我最近试图build立一个Node.js以及node-sqlite3由于有限的内存资源的小型网站。 我过去用Python构build了一个类似的小型网站,发现node-sqlite3与Python的sqlite3模块相比似乎相当迟钝。 我做了一批1000个SELECT操作,注意到node-sqlite3需要几乎两倍的时间来完成。 有没有其他人注意到同样的事情? 如果我想继续使用Node.js,有关优化数据库访问的任何build议?

更新:我添加了用于testing的代码:

Node.js的:

var sqlite3 = require('sqlite3').verbose(); var util=require('util'); var dbfn = './db.sqlite'; var db = new sqlite3.Database(dbfn,sqlite3.OPEN_READONLY, function(err) { if(err) { console.log(err); } else { var perpage=10,max=500,table='data2012',kw='sa'; for(var offset=1;offset<max;offset+=perpage) { stmt = util.format('select * from %s where xxx like "%s%" limit %d offset %d',table, kw, perpage, offset); db.all(stmt); } } }); 

python:

 import sqlite3 DATABASE = './db.sqlite' db=None try: db = sqlite3.connect(DATABASE) except: sys.stderr.write(os.getcwd()) table='data2011' kw=('sa%',) perpage=10 max=500 for offset in xrange(1,max,perpage): stmt = 'select * from %s where xxx like ? limit %d offset %d'%(table, perpage, offset) rs = db.execute(stmt, kw) rs.fetchall() db.close() 

那么,python库和node.js库不能以相同的方式工作。

Python将以相同的方式在同一个线程中运行所有内容。 最多同时处理一个查询,并且内存占用仅限于一个查询的结果。

另一方面,node.js是asynchronous的并且获得非阻塞行为,sqlite引擎分布在一个线程池中。 它不像事件循环那样在同一个线程中运行。 因此查询将涉及一些上下文切换,并且由于OS调度器的成本而导致开销。 而且,因为它们可以同时执行,所以还需要考虑并发的成本(互斥量,信号量等)。 最后,内存占用更高(在给定的时间点,更多待定查询和内存中的查询结果),这会给垃圾回收器带来更大的压力。

有了这个特定的基准,假设查询只是快速查找,node.js因此比Python慢​​,因为线程活动的成本高于并行运行某些查询的好处。