Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202665
  • 博文数量: 11
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-03 14:24
个人简介

从客服技术支持到程序开发 从传统电信行业到互联网,以及移动互联网 岁月流逝,梦想依旧 个人订阅号--licaduo

文章分类

全部博文(11)

文章存档

2010年(11)

我的朋友

分类: Mysql/postgreSQL

2010-06-22 22:54:12

     关于数据库的优化高人很多,常用的方法也很多,那些常用的类似索引优化之类的我这里就不介绍了。我只是把我在实际程序应用中的其他方面的优化心得分享下。
     我的优化方法有以下:
   1。 把一些表放入内存
   对于程序启动产生数据,程序退出数据消失的动态数据,可以考虑把这张表放入内存中,使用的方法是改变这张表的存储引擎,具体sql查下文档,这里就不写了。
   2。 sql语句的优化。
   其实数据库基本的功能应该是存储数据,而不是处理我们的业务逻辑。如果我们把本应该程序自己处理的业务逻辑交给数据库去做,那么收获就是我们自己的程序复杂度小了,但是另外的结果就是查询效率下降。假如我们有3张表:用户表,组表,用户组关系表。假设用户和组是多对多的关系。那么如果查询一个用户所在的组下的全部用户信息。执行这个查询需要下面的步骤
     a 从用户组关系表中查询用户有几个组
     b 根据组id从用户关系表中分别查询组内的用户
     c 根据得到用户id,到用户表中查询用户的详细信息
     最简单的办法是把上面查询写在一个sql里交给服务器,另外一种是自己在程序中按照上面的步骤去做。
     经过测试,在并发的情况下两种操作的效率差距非常大,效率相差数倍。如果我们联表去查询,数据库相当于是针对每个独立的查询结果进行乘积处理。在并发的情况下,我们把这么多的任务同时交给数据库服务器必然导致效率下降。
     所以我的心得是尽量减少复杂的联表查询,而是由程序自己去分开步骤去查询。
   3。自己在内存中去实现一张数据库表
     对于并发服务器,针对客户端的socket描述符,心跳时间,状态,用户id等的对应关系这些数据是要经常去查询的。针对每一个接收到的数据包都会去查询一次。试想如果我们服务器同时在线的客户端10000个,每个客户端5秒发一数据包,那么这个查询的频率就是非常高的。把这个数据放入数据库中显然是一个不好的选择。
     针对这种数据相对简单,但是查询频率非常高的数据,最好的解决方法是把这个表在内存中自己实现。具体的实现方法在我的另外一个文章中详细写了。这里就不写了。
阅读(2084) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~