V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daiv
V2EX  ›  程序员

小型Web数据库的选择

  •  
  •   daiv · 2013-12-05 22:36:10 +08:00 via iPhone · 6626 次点击
    这是一个创建于 4008 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一直用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个表,数据1—100万之间。
    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   ·   实用小工具   ·   2631 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:38 · PVG 23:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.