我做一个类似blog的个人主页
每次登陆都需要加载很多信息 而且信息来源表数据量很大 查询速度很慢
哪位童鞋给我点建议啊 ~
目前采用的是缓存 登陆后将主页信息放置在缓存里 注销清空
登陆时重新加载...但是登陆奇慢啊~
[quote]唔...进入界面之后,界面连个毛都没有..岂不是很尴尬...[/quote]
难道你页面上一点静态的东西都没有?总有些静态的东西吧。。。
而且,你这个时候已经显示用户登录成功了,然后会显示一个数据加载中之类的东西,至少让用户知道再等一会就可以了。
你原来的,点了一下登录提交后就等,什么提示也无法给出。。。给人的体验不好
这个应该只能从数据库查询上做优化了
把一些共通的数据放到服务器启动的时候加载
[quote]优化不起来 查询都是简单的查询,只是信息来自关联表 建立索引意义不大[/quote]
那就这样做,登陆只验证用户名和密码。然后就跳转进页面了。
在这个页面上用Ajax去异步加载你要的那些信息。
市面上也有很多网站是这样做的,登陆成功后过了几秒再显示一些信息。
登录后,用ajax进行异步调用,加载完你要的数据后,跳转到页面就能看到了。
这个可以从以下几个方面入手:
一、优化查询,分析你查询中那些是耗时较高的,找出后着手进行优化,如果优化后效率提神有限,可以考虑分拆(非拆库分表),简单说就是把一个查询分成多个子查询进行测试,如果多个子查询性能优于一个查询,此时可以考虑这二者的均衡,分析他们之间的差异性在哪并进行解决;
二、大家都知道的缓存,缓存在一定程度上不能按照你说的那样子“登陆后将主页信息放置在缓存里 注销清空 ”来使用,可以考虑缓存到一个固定的非访问并发高的时间段(比如凌晨2点),当然这里缓存自己也有算法回收内存;这里具体分析下需要缓存那些信息
三、页面加载技术,可以先加载一个页面的大框架,然后比如取用户Blog资料的部分可以使用Ajax来异步加载。
四、引入一些外部资源(比如项目中使用到了jQuery),就可以使用google提供的资源
...
[size=x-large]
这个时候你可以考虑异步加载。
在你输入用户名和密码的时候数据也在后台不停的传输中,另外压缩数据传输,比如图片,JS文件之类的压缩传输。[/size]
数据库里储存了图片吗?为啥会数据量很大,表示关心.你只是一个博客而已.如果数据量真的很大,且存了图片之类的资源可以考虑下nosql.
[quote]我做一个类似blog的个人主页
每次登陆都需要加载很多信息 而且信息来源表数据量很大 查询速度很慢
哪位童鞋给我点建议啊 ~
目前采用的是缓存 登陆后将主页信息放置在缓存里 注销清空
登陆时重新加载...但是登陆奇慢啊~[/quote]
我提取的要点:
分析:
建议:
因为后台异步加载后,需要一定时间:
主页中易变的数据,采用ajax方式去后台获取,主页只做ui展示,先不包含数据
[b]可以考虑分片页面缓存. 把一些你觉得不可以缓存的东西, 比如
[quote]没有共同的数据,有点类似最近谁访问你~你访问谁~你干了什么那些信息 这不是共通的[/quote] 不进行缓存. 把那些内容可能长时间不变的(事实上一个页面上很多信息都是长时间不变的)进行缓存. 这样就可以大大减少走库的压力了. :D [/b]
[quote]现在是几秒……以后上线岂不是要几分钟……[/quote]
不会的啊,只是把你现在这几秒钟做的事情分一下而已,先以最快的速度让用户登录,然后再显示其它信息,加起来和你原来一样,但是给用户的体验会好很多,不会感觉到慢
[quote]的意思是将请求中一次做完的事情拆分给多个请求去做...可是我现在一个查询就慢的要死 慢的要死啊[/quote]
用户登录只需要匹配下用户名和密码吧,就查一下,这个怎么会慢呢?
[quote]偶说加载其他关联数据……不是密码那里……[/quote]
对呀,这样子用户登录就很快,马上可以进入登录后页面了。
[quote]q472732639 写道
可以考虑分片页面缓存. 把一些你觉得不可以缓存的东西, 比如
引用
没有共同的数据,有点类似最近谁访问你~你访问谁~你干了什么那些信息 这不是共通的
不进行缓存. 把那些内容可能长时间不变的(事实上一个页面上很多信息都是长时间不变的)进行缓存. 这样就可以大大减少走库的压力了.
呃...现在正在和需求方协商拿掉几个...[/quote]
不知道你说的拿掉是什么? 直接把栏目拿掉..这样的话, 解决问题的思路已经完全变了喽.
可以考虑下后台动态生成静态html页面。用户登录时直接访问html页面速度会快很多
数据库查询时做优化,把一些公共的数据放在系统启动时加载
首先 加载 UI 后 异步加载数据。
一个首页怎么可能会很慢哦??登录进去之后,你干啥子操作了啊,无非就是查一些栏目的信息列表数据。要是数据比较多,
在主页上显示的列表数据,只查一些,别一下子刷刷全部给拽到内存中,
还有就是你的页面布局,别用Table来布局,这个布局我是服了,,,, 它是要等全部内容加载完才正常显示的。
其他的就是向上面同志们说的相关建议,我就不啰嗦了
可以主页静态化....
参见[url]www.xinbaowang.com[/url]
1:登录操作和其它业务数据加载异步化
比如,你的首页用户登录后会展示用户名,用户的好友信息等等,将用户基本信息和其它一些需要展示的信息放在不同的缓存里,用户登录只做登录操作,其它的业务展示也只做自己的相关操作,各不影响。
2:考虑将首页需要展示的信息建立结果表在数据库中,后台定时统计结果到该结果表,用户登录是直接从结果表查询内容并加载到缓存,注销时更新缓存信息到结果表。当然这中间涉及到很多细节,比如并发的问题。
不管怎么样,数据库设计和查询SQL一定要好好看看是否合理,单独在数据库执行的速度是否良好,这样才能判定到底是数据库的问题还是程序段的问题。
你首先确认你系统的瓶颈在哪儿,是在DB层,还是网络,还是主机,还是你的应用,你可以挨个测试,还有就是尽可能的发挥DB的潜能,让它更高效的工作,如果能在DB层做的东西最好在DB层做了。主机方面也可以考虑做点工作。确定问题所在了才可以做优化呀。
另外你登录要加载好多信息,不知道你这些信息是必须要在登录时加载的嘛,可以把不是必须的考虑延迟加载。
1.web开发过程中要注意这个数据流,也要注意各种地方的缓存特性。缓存是加快web性能的关键因素。
2.浏览器缓存,缓存完全静态的数据,做好缓存标识的控制
3.服务器端的方向代理缓存,可以缓存页面
4.应用服务器可以缓存两类数据,用户相关的和所有用户共享的,这类数据变化频率不会太快,而重新计算代价相对较大
5.最后才到达DB。
用Ajax进行比较细粒度的请求控制。
我个人的建议是这样的,这种情况下异步加载会好很多:
1.展示登录页面,登录成功的时候重定向到主页;
2.先给用展示一个没有数据的框架页面,上面包括登录按钮,和需要加载数据的容器;
3.框架页面加载完毕的时候发起一个异步请求,向服务器请求数据(数据量比较大的时候尽量考虑使用JSON数据格式),这个时候可以给用户一下比较友好的提示,比如:“正在加载页面数据,请稍等....”(如果支持HTML5的话甚至还能检测数据加载的进度)。然后等数据加载完毕的时候用js去检索获得的数据集并添加到页面容器中(同时也可以添加到页面的缓存数据里,留以备用)。
如果数据实在是太多的话尽量用分页(异步分页)。这样的话还能减少服务器的很多负担。
感觉应该是你数据库设计没考虑性能,出现设计上的问题才会这样,如果一些应该冗余不冗余的数据,而分分钟去做关联表的查询操作是很费时的,感觉应该重新考虑一下数据库设计
我来凑点分,吼吼