1
daiv OP 我的需求:数据库只做 插入和查询操作,不需要 更新 操作。只有2个表,数据1—100万之间。
|
2
ixiaohei 2013-12-05 22:47:02 +08:00 1
mysql
|
3
ipconfiger 2013-12-05 22:51:02 +08:00 1
@daiv 每一条多大呢?
|
4
daiv OP @ipconfiger 小于100k
|
6
ipconfiger 2013-12-05 22:57:51 +08:00 1
@daiv 按每条100K计算,100w条大概有10G左右的数据,还是上正儿八经的数据库吧,128M什么的就不要想了。bdb,sqlite,leveldb神码的都存在多进程的问题,且bdb和leveldb都需要内存
|
7
daiv OP |
8
clino 2013-12-05 23:00:27 +08:00 1
sqlite 我觉得注意一下是可以提高并发的,减少被锁影响的方法:
-将timeout时间设长一些 -将操作数据库的时间尽量缩短,例如读就一把读出来再处理,写也是把要写的数据全部准备好了一把写入 |
9
daiv OP @ipconfiger 一般10万条左右,上面写错了
|
10
yakczh 2013-12-05 23:10:55 +08:00 1
memsql
|
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进程里,这样我觉得对避免这个问题也有好处 |
12
ipconfiger 2013-12-05 23:17:23 +08:00 1
@daiv 你就只有128M的VPS啊?
|
13
tshwangq 2013-12-05 23:35:27 +08:00 1
firebird?
|
14
moroumo 2013-12-05 23:37:20 +08:00 1
我用得也是sqlite,也是128M VPS,哈哈。
注重一下业务流程上能不能简化,避免读写冲突 |
15
ipconfiger 2013-12-05 23:42:21 +08:00
@daiv 1G,2G的数据可以继续用SQLite,为了避免锁问题,可以用一个独立的进程单线程访问SQLite数据库,然后web用tornado异步请求
|
16
tshwangq 2013-12-05 23:44:47 +08:00
Kyoto Cabinet, 似乎也是个不错的选择。
|
17
likuku 2013-12-05 23:48:07 +08:00 1
加一个memcached…读的负载转移到内存去。
|
18
tshwangq 2013-12-05 23:50:00 +08:00 1
|
19
barbery 2013-12-06 00:13:42 +08:00
用mysql的myisam表, 关闭innodb, 应该耗不了多少内存吧
|
20
loading 2013-12-06 07:15:46 +08:00 via iPhone
数据量不大可以使用sqlite内存方式
|
21
loading 2013-12-06 07:18:03 +08:00 via iPhone
分割为多个sqlite文件,查询前先判断在哪个文件(数据库),毕竟你只有128m
|
23
daiv OP @ipconfiger 有 256 512,1G 都有呀,不是单单 128 啦
|
27
loading 2013-12-06 08:40:56 +08:00 via iPhone
把表再拆一次,如名字a-f一个
|
28
hjie 2013-12-06 08:51:56 +08:00
sqlite 写入锁 多线程下 真的很烦啊
|
29
tshwangq 2013-12-06 09:18:22 +08:00
@daiv 嘿嘿,我也是看到你这个需求很感兴趣,感觉可能有一款类似sqlite的nosql存在,所以搜索了下,其实没有实战经验。 记得updates一下你最终结果哦。
|
30
usoluyun 2013-12-06 09:49:49 +08:00
数据库写入都是有锁的吧,否则mysql也不会搞什么读写分离了吧。关键是读的时候要指定 no lock不是么?
|
32
yolio2003 2013-12-06 09:52:06 +08:00
非常喜欢sqlite,留名学习提高并发的方法~
|
33
uwh5ed9 2013-12-06 09:53:01 +08:00
mark
|
34
takwai 2013-12-06 09:59:48 +08:00
用 15 楼方法,或者设置一下使用 WAL 模式 http://www.sqlite.org/draft/wal.html
|
35
ipconfiger 2013-12-06 10:02:46 +08:00
WAL是好办法
|
36
ericls 2013-12-06 10:39:13 +08:00
128M还是跑sqlite吧
我之前是因为跑不动mysql才跑的sqlite 放的自己的一个小博客 有一段时间了 反正没流量 所以也就没有进一步的需求 不过楼主这种站子做大了 换大一点的服务器也是应该的吧。。。 搞点内存配合memcached redis神码的用 |
37
daiv OP @ipconfiger wal 模式 读写不干涉,挺好的。
@takwai 要尝试一下 wal,读和写之间不会阻塞 @ericls sqlite 还是很省资源的,我还有更大的内存啦,sqlite 128够用,知识有锁。 @hjie 是呀,sqlite 要是没读写的冲突,那就很爽了 @usoluyun 读得时候 sqlite 没有锁吧 |
38
est 2013-12-06 10:58:37 +08:00
|
39
duzhe0 2013-12-06 16:24:49 +08:00
Mysql的默认存储引擎Myisam就做到并发插入和读取。
|
40
zstxt1989 2013-12-06 20:43:53 +08:00
可以试试mongodb
|
42
duzhe0 2013-12-07 00:58:50 +08:00
是的。Myisam引擎虽然是表级的读写锁,但插入却不需要写锁。所以对于没有update的场景,Myisam的并发性能足够好。
|