小型Web数据库的选择 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
daiv
V2EX    程序员

小型Web数据库的选择

  •  
  •   daiv 2013-12-05 22:36:10 +08:00 via iPhone 6989 次点击
    这是一个创建于 4328 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直用Python + web.py + SQLite ,主要这个数据库小巧,省资源,有128m就够用。但是SQLite 写的时候有锁,导致并发大大减弱。

    我该放弃SQLite ?

    我的需求:数据库只做 插入和查询,不需要更新数据的。只有2个表,

    请大家推荐一款,谢谢啦
    想要插入的时候也可以查询呀。毕竟没有更新操作。
    42 条回复    1970-01-01 08:00:00 +08:00
    daiv
        1
    daiv  
    OP
       2013-12-05 22:43:20 +08:00 via iPhone
    我的需求:数据库只做 插入和查询操作,不需要 更新 操作。只有2个表,数据1100万之间。
    ixiaohei
        2
    ixiaohei  
       2013-12-05 22:47:02 +08:00   1
    mysql
    ipconfiger
        3
    ipconfiger  
       2013-12-05 22:51:02 +08:00   1
    @daiv 每一条多大呢?
    daiv
        4
    daiv  
    OP
       2013-12-05 22:54:03 +08:00 via iPhone
    @ipconfiger 小于100k
    daiv
        5
    daiv  
    OP
       2013-12-05 22:55:14 +08:00 via iPhone
    @ixiaohei mySQL 是不是有一点点大了 谢谢
    ipconfiger
        6
    ipconfiger  
       2013-12-05 22:57:51 +08:00   1
    @daiv 按每条100K计算,100w条大概有10G左右的数据,还是上正儿八经的数据库吧,128M什么的就不要想了。bdb,sqlite,leveldb神码的都存在多进程的问题,且bdb和leveldb都需要内存
    daiv
        7
    daiv  
    OP
       2013-12-05 23:00:23 +08:00 via iPhone
    @ipconfiger 最大1-2G,一般都是10条左右了。

    只做插入和查询。
    推荐一个啦
    clino
        8
    clino  
       2013-12-05 23:00:27 +08:00   1
    sqlite 我觉得注意一下是可以提高并发的,减少被锁影响的方法:
    -将timeout时间设长一些
    -将操作数据库的时间尽量缩短,例如读就一把读出来再处理,写也是把要写的数据全部准备好了一把写入
    daiv
        9
    daiv  
    OP
       2013-12-05 23:02:20 +08:00 via iPhone
    @ipconfiger 一般10万条左右,上面写错了
    yakczh
        10
    yakczh  
       2013-12-05 23:10:55 +08:00   1
    memsql
    clino
        11
    clino  
       2013-12-05 23:14:14 +08:00   1
    上面减少操作数据库时间的具体做法,我在用uliweb的时候用到过一个就是
    for item in model:
    这里面对model的遍历会引发对数据库的操作,这样如果for里做得时间比较多,花的时间比较长,那占用的时间就长了
    可以改成这样:
    for item in list(model):
    这样就将操作数据库的时间最小化了

    还有我碰到一个情形是,除了web的进程,还有一些daemon进程也会操作数据库,后来就改成调用web api来做,这样把对数据库的操作都集中到web进程里,这样我觉得对避免这个问题也有好处
    ipconfiger
        12
    ipconfiger  
       2013-12-05 23:17:23 +08:00   1
    @daiv 你就只有128M的VPS啊?
    tshwangq
        13
    tshwangq  
       2013-12-05 23:35:27 +08:00   1
    firebird?
    moroumo
        14
    moroumo  
       2013-12-05 23:37:20 +08:00   1
    我用得也是sqlite,也是128M VPS,哈哈。
    注重一下业务流程上能不能简化,避免读写冲突
    ipconfiger
        15
    ipconfiger  
       2013-12-05 23:42:21 +08:00
    @daiv 1G,2G的数据可以继续用SQLite,为了避免锁问题,可以用一个独立的进程单线程访问SQLite数据库,然后web用tornado异步请求
    tshwangq
        16
    tshwangq  
       2013-12-05 23:44:47 +08:00
    Kyoto Cabinet, 似乎也是个不错的选择。
    likuku
        17
    likuku  
       2013-12-05 23:48:07 +08:00   1
    加一个memcached…读的负载转移到内存去。
    tshwangq
        18
    tshwangq  
       2013-12-05 23:50:00 +08:00   1
    http://yserial.sourceforge.net/
    这个也很有意思啊,用sqlite构建起来的小型nosql。
    非常符合你的写+读的场景
    barbery
        19
    barbery  
       2013-12-06 00:13:42 +08:00
    用mysql的myisam表, 关闭innodb, 应该耗不了多少内存吧
    loading
        20
    loading  
       2013-12-06 07:15:46 +08:00 via iPhone
    数据量不大可以使用sqlite内存方式
    loading
        21
    loading  
       2013-12-06 07:18:03 +08:00 via iPhone
    分割为多个sqlite文件,查询前先判断在哪个文件(数据库),毕竟你只有128m
    daiv
        22
    daiv  
    OP
       2013-12-06 08:20:24 +08:00
    @clino 太感谢你了,我检查一下代码,试试你的方法。谢谢。不过,我的代码中,每次都是取出一条数据的
    daiv
        23
    daiv  
    OP
       2013-12-06 08:20:53 +08:00
    @ipconfiger 有 256 512,1G 都有呀,不是单单 128 啦
    daiv
        24
    daiv  
    OP
       2013-12-06 08:31:05 +08:00
    @tshwangq 第一次听说,请问这个适合我使用的场景么? 读+写,不update
    daiv
        25
    daiv  
    OP
       2013-12-06 08:34:29 +08:00
    @tshwangq 嗯,你介绍了好多个,我都没碰过的,这个 y_serial 我尝试一下
    daiv
        26
    daiv  
    OP
       2013-12-06 08:34:59 +08:00
    @loading 我已经分割成 三个数据库了,每个表一个数据库。。。
    loading
        27
    loading  
       2013-12-06 08:40:56 +08:00 via iPhone
    把表再拆一次,如名字a-f一个
    hjie
        28
    hjie  
       2013-12-06 08:51:56 +08:00
    sqlite 写入锁 多线程下 真的很烦啊
    tshwangq
        29
    tshwangq  
       2013-12-06 09:18:22 +08:00
    @daiv 嘿嘿,我也是看到你这个需求很感兴趣,感觉可能有一款类似sqlite的nosql存在,所以搜索了下,其实没有实战经验。 记得updates一下你最终结果哦。
    usoluyun
        30
    usoluyun  
       2013-12-06 09:49:49 +08:00
    数据库写入都是有锁的吧,否则mysql也不会搞什么读写分离了吧。关键是读的时候要指定 no lock不是么?
    HunterPan
        31
    HunterPan  
       2013-12-06 09:51:52 +08:00
    @hjie 赞同,
    yolio2003
        32
    yolio2003  
       2013-12-06 09:52:06 +08:00
    非常喜欢sqlite,留名学习提高并发的方法~
    uwh5ed9
        33
    uwh5ed9  
       2013-12-06 09:53:01 +08:00
    mark
    takwai
        34
    takwai  
       2013-12-06 09:59:48 +08:00
    用 15 楼方法,或者设置一下使用 WAL 模式 http://www.sqlite.org/draft/wal.html
    ipconfiger
        35
    ipconfiger  
       2013-12-06 10:02:46 +08:00
    WAL是好办法
    ericls
        36
    ericls  
       2013-12-06 10:39:13 +08:00
    128M还是跑sqlite吧
    我之前是因为跑不动mysql才跑的sqlite
    放的自己的一个小博客 有一段时间了 反正没流量 所以也就没有进一步的需求

    不过楼主这种站子做大了 换大一点的服务器也是应该的吧。。。
    搞点内存配合memcached redis神码的用
    daiv
        37
    daiv  
    OP
       2013-12-06 10:51:20 +08:00
    @ipconfiger wal 模式 读写不干涉,挺好的。
    @takwai 要尝试一下 wal,读和写之间不会阻塞
    @ericls sqlite 还是很省资源的,我还有更大的内存啦,sqlite 128够用,知识有锁。
    @hjie 是呀,sqlite 要是没读写的冲突,那就很爽了
    @usoluyun 读得时候 sqlite 没有锁吧
    est
        38
    est  
       2013-12-06 10:58:37 +08:00
    @takwai
    @ipconfiger

    睾科技。xiao习了!
    duzhe0
        39
    duzhe0  
       2013-12-06 16:24:49 +08:00
    Mysql的默认存储引擎Myisam就做到并发插入和读取。
    zstxt1989
        40
    zstxt1989  
       2013-12-06 20:43:53 +08:00
    可以试试mongodb
    daiv
        41
    daiv  
    OP
       2013-12-06 22:10:05 +08:00
    @duzhe0 默认就可以 并发插入 读取?

    @zstxt1989 NoSQL 还是不是很熟悉,还没有学习
    duzhe0
        42
    duzhe0  
       2013-12-07 00:58:50 +08:00
    是的。Myisam引擎虽然是表级的读写锁,但插入却不需要写锁。所以对于没有update的场景,Myisam的并发性能足够好。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2734 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 08:44 PVG 16:44 LAX 01:44 JFK 04:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86