数据库查询太慢,无法优化。。。

2017-07-28 17:36:21 +08:00
 hujianxin

大佬们好,我现在遇到一个问题,希望大佬可以帮忙解答一下。

我需要在一个数据库里读取数据,现在这个数据库的现状是:

  1. 这个数据库是别人的数据库,我只负责读,而且只能在这里读,而且不能修改这个数据库。
  2. 数据库里面表结构比较复杂,数据量大,每次查询需要的数据都需要很长时间。10 万条数据需要 5 分钟吧。
  3. 如果我在前端页面提供了某些条件,让用户提交确定,然后后台去查询,再计算,那样用户就需要在电脑屏幕前等待好久,用户体验很屎,几乎没法用。

我的问题描述的差不多了。

我现在的想法是,通过一个后台线程,定时的去查询数据库,然后将 join 之后的数据,插入到我的数据库中。然后我的 web 引用只需要查询我的数据库,就免去了 join 的操作。速度会有大的提高。至于缺点呢,我能想到的就是,因为需要定时计算,所以最新的几个小时的数据,我没法提供查询。

各位大佬,面对这样的问题,您有什么解决方案吗?

您觉着我的这个方案可行吗?

谢谢啦!

4875 次点击
所在节点    程序员
27 条回复
wangchen
2017-07-28 18:57:16 +08:00
@hujianxin 你的方案是正确的,问题在于同步的频率和方法。

这里面有四个部分,数据源、数据同步工具、数据转换工具、目标数据库。

- 数据源,指那个只读库。
- 目标数据库,指你自己设计的数据库,它可以与数据源采用不同的结构,面向查询优化。
- 数据同步工具,不要去同步复杂查询的结果,要按主键同步每一个需要的表,速度快、可增量。
- 数据转换工具,把增量数据转换成目的数据库要求的形式。
ihaveobj
2017-07-28 19:09:32 +08:00
放你自己数据库后,如果别人更新了怎么办?如果只是增量那倒是可以

用其他人的数据很被动,感觉还是加一层缓存,内存怕太大可以用文件缓存,优化一下应该能用
SlipStupig
2017-07-28 19:15:20 +08:00
分片 缓存 读写分离
hujianxin
2017-07-28 19:42:10 +08:00
@misaka19000 好的,谢谢您的建议!
@danielmiao es 我倒是用过,但是没深入的研究,你的建议非常好,我回去研究一下。
@stabc 好的,谢谢!
@wangchen 非常感谢,原来还有套路啊,却是,同步频率这个我可以比较轻松的优化,同步工具的话,我需要回去查一下,有什么好的工具不,谢啦!
@ihaveobj 别人更新表结构的话,我可以更新我的导入程序,但是我这边的表结构就不变化啦。文件缓存这个,我回去研究一下,感谢!
ncisoft
2017-07-28 20:14:13 +08:00
改业务需求吧,oltp 不是给你干 olap 业务的:10 万条数据需要 5 分钟吧。oltp 没有这种查大数据集的用法,btree 不适合干这个
six880214
2017-07-29 00:46:59 +08:00
先看表结构,主键,外键和索引。然后尽可能的优化 sql,然后再想别的方法。
sampeng
2017-07-31 10:53:22 +08:00
@hujianxin
你这其实就是缓存,只是缓存的地方是数据库而已。不是只有缓存到内存才叫缓存。

因为目标库是只读的,你也没办法要求对方给你修改的通知。那只能定时去查了。但如果修改和删除记录。你这边是不可感知的。会比较麻烦,要么全部数据对比一下然后更新。要么就是定时把整个库删掉在重建。没什么别的好办法。当然,如果只是增加。那就定时查吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/378680

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX