日期:2014-05-20  浏览次数:20983 次

几百万数据的数据库查询
大半夜的我这有一个很严重的问题一直困扰这我

一个数据库(SQL2008)里面有一张收支明细表:字段如下 
Mark(1=收入,2=支出)

ID(自增)   Messages       Mark   Money    CreateTime
1      您xxxx收入xx元      1    10.00    2012-11-01 20:10:10     
2      您xxxx支出xx元      2    10.00    2012-11-01 21:10:10     
3      您xxxx收入xx元      1    10.00    2012-11-01 22:10:10     
4      您xxxx收入xx元      1    10.00    2012-11-01 23:10:10     
...
2000000   您xxxx支出xx元      2    10.00    2012-11-01 23:30:10    

这张表每天插入的数据大概是 几十万条数据左右

每30分钟插入一些数据(这个每次插入也有几万),期间还有零零散散的一些插入

问题就出现在这里 每次在插入的时候  执行(简单的SQL)查询就没法查询了  一直显示请求超时直到插入完毕才恢复
数据量小的时候没发现这个问题 直到后面数据量越来越大已经到了200多万了  真的是查询也费尽插入更费劲

还有操作数据库用的普通的 ADO 希望这里有接触过百万数据的高手指点下  没接触的也可以帮帮忙 

帮忙给出解决方案
------最佳解决方案--------------------
首先,说点技术外的问题:
一边在插入,一遍查询,这样的结果有意义吗?
也就是说,你们的业务需求应该稍微调整下,
至少保证查到有意义的结果。

下面解决技术问题:
1>优化插入算法,分小批次插入。
2>优化表索引
3>查询语句中,表名后面全部加上with(nolock)

4>几百万数据不算很严重,除非你那太机器太差,运行的东西又太多!!!
大数据的机器,致少要保证足够的内存!!

就说这么多吧,其他的自己再慢慢查吧



------其他解决方案--------------------
可以把插入数据放在另一张表中,查询的时候两张表一起查,然后把结果合并,

到每天半夜没人查询的时候再把两张表合并起来,
------其他解决方案--------------------
要么就升级服务器的硬件,用小型机,或者做数据库优化,
------其他解决方案--------------------
简单的思路就是读写分离
最简单的设计 也就是所谓的“双回路”设计:
A B两个一模一样的数据库
需要插入的时候 A数据库声明闭锁(也就是声明拒绝查询和后继插入挂起)(B数据库继续提供查询服务) 把目标队列插入数据库
操作完毕后开发A数据库提供查询 B数据库闭锁 插入数据 插入完毕后开放B数据库
如果又有插入数据的请求 重复以上动作

ps:以上只是理论 实际设计要考虑的东西更多
------其他解决方案--------------------
楼上几位说的好像很不错  但是分2个表    。。。。。这太难了吧
------其他解决方案--------------------
两个表的字段结构相同,你的sql语句都不用改,只是在适当时机合并两张表而已,不是很复杂,

引用:
楼上几位说的好像很不错  但是分2个表    。。。。。这太难了吧

------其他解决方案--------------------
HBase 淘宝,facebook在用。