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

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

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

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

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

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

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

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

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

谢谢啦!

4260 次点击
所在节点    程序员
27 条回复
234747005
2017-07-28 17:42:37 +08:00
首先你要说一下你在用的是什么数据库。。
noNOno
2017-07-28 17:42:53 +08:00
做个缓存,当然可以了。
hujianxin
2017-07-28 17:44:19 +08:00
@234747005 用的是一个 Oracle,里面放了有 2t 的数据,暂时。速度很慢。
@noNOno 缓存的方案我想一下,估计可能占用内存太大了,谢啦
hujianxin
2017-07-28 17:45:07 +08:00
@234747005 他们的数据库,我也没法优化,人家只是让我们查询
suixn
2017-07-28 17:49:47 +08:00
https://github.com/alibaba/yugong
用这个先全量同步一份数据,之后实时同步对方数据过来。
这样就可以只用你的库了。
hujianxin
2017-07-28 17:53:29 +08:00
@suixn 只用我的库也是不行的,我的问题不是数据传输慢,而是 join 什么的速度慢,用我自己的数据库也是很慢很慢,
suixn
2017-07-28 17:56:08 +08:00
@hujianxin #6 同步过来做优化嘛,分库分表,加索引什么的。当然,先看看 sql 本身有没有可以优化的地方。
asen477
2017-07-28 17:56:36 +08:00
做数据缓存,能解决部分问题。
syncher
2017-07-28 17:59:10 +08:00
看到 #3 中的 Oracle, 吓得我撒腿就跑!
assad
2017-07-28 18:04:08 +08:00
忍吧,别人的库,你没法搞这个那个的,唯一能优化的,就是结果缓存。
什么分表,索引,你有权限改么,没的话就没什么办法了
hujianxin
2017-07-28 18:04:57 +08:00
@suixn 是个解决办法,哈哈,谢啦
hujianxin
2017-07-28 18:05:37 +08:00
@assad 我说的这种,使用后台线程整理数据库结果的方式,您觉着可行不?
LosLord
2017-07-28 18:05:45 +08:00
select * form table 全查过来
fds
2017-07-28 18:05:52 +08:00
用户查询后就立即把这次查询出来,但注明查询中。等一会儿有结果了,通知用户查看结果。结果永久保存在本地,可以随时查看。既然查询速度不能提高,只能是让用户忍忍咯。或者你缓存下结果,如果有一个用户查过了,其他人可以直接看。
sampeng
2017-07-28 18:24:41 +08:00
你这相当于数据缓存了。。当然可行。问题就在于重新 flush 你自己的数据缓存的时间。新数据会得不到。
如果对方系统你可以干预,让他在 insert 的时候通知一下你去更新你数据库
hujianxin
2017-07-28 18:26:18 +08:00
@fds 可以通过邮件通知,是个好方法,谢谢啦!能在一定程度上解决这个设计很渣的现状。缓存在本地的话,估计会占用大量的内存,缓存过期,还是很渣,我自我感觉,缓存在我这个问题上,发挥的作用可能不太大。
hujianxin
2017-07-28 18:29:02 +08:00
@sampeng 谢谢提出建议。我的这种情况,不算缓存吧,我是把整理后的结果放到我自己的 mysql 里面了,然后加上索引,避免了 join,所以速度会快。您说的 flush 数据缓存,我不太明白呢,希望您能说的具体一下,谢谢了。对方的数据库,不让动呀,我打算一个小时增量查询一次。然后继续插入我的数据库。
我这样描述的话,您觉着合适吗?
misaka19000
2017-07-28 18:36:01 +08:00
增加定时抓取的频率,尽可能保证数据完整
danielmiao
2017-07-28 18:37:16 +08:00
扔到 es 做检索
stabc
2017-07-28 18:39:38 +08:00
我读到一半首先想到的就是你自己的这个方案,就是读到自己的数据库里。
最新数据的更新方案,不了解你的具体业务流程也没法给意见,唯一的意见就是按照这个思路走下去吧。

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

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

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

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

© 2021 V2EX