fcicq
新手上路

初级会员
UID 24467
精华
0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8 来自 fcicq.net
状态 离线
|
   
[广告]: 代充Paypal帐号美元
喜悦原创首发 - 看各种规模的数据库应用
0 提前说点闲话
0.0 闲话:
继续征友情链接.技术类优先....最后几天啦...
并且感谢上次给偶的文章(小论各种缓存手段)投票的同志们.
希望同志们继续支持这篇文章.....欢迎投票.
0.1 acc/mssql
M$的平台上(asp/.net等),数据库一般都是它.
access已经接近过时(但是,有许多的方法可以避免它的缺陷,这里不多做讨论)
0.2 oracle
跨平台的大型应用.一般玩的起这种数据库的一般都是该方面的牛人.
或者就是什么培训班毕业的同志,同样不考虑
================
本文从这里才进入正题,主要讨论的就是中小规模的开源数据库应用.
1 sqlite
为什么把sqlite提到mysql的前面?你考虑过没有?
作为轻量级的开源数据库,在中小规模应用中它可以作为主力,但是大家都没有认识到它的威力.
据sqlite官方自称,承载100k pv是不成问题的.而sqlite官方的访问量是1M pv.照样能够正常工作.
在许多评测中(当然不可能是大型应用的评测,这种东西sqlite是跑不动的.)sqlite比pgsql,mssql发挥都要好不少.
奶瓶前面有一个关于session的应用,就是基于sqlite的.
sqlite虽然在某些功能方面远不及mysql,但是如果有比较好的算法,偶相信问题是可以被解决的.
小声说:php5去掉了mysql的内置支持.而改为默认支持mysql.这可能是mysql在开源社区的一次小挫折.
虽然php官方不承认这与mysql的版权有关,但是偶觉得也是有关系的
(mysql双重授权,对GNU GPL软件实行GNU GPL的开源,对其它软件进行商业授权,好像大批量100多美刀/个)
但是pgsql无此问题.它是bsd授权.
在偶以前的文章中曾经提到了pdo.
sqlite和mysql之间的迁移应该是比较容易的.仔细看看语法就知道了.
(你看看这个分页的语法,和mysql可以说是99%相同的.)
管理部分有sqlitemanager(http://sqlitemanager.sourceforge.net/),很类似phpmyadmin.管理问题大可放心.
下面的部分中偶讲继续介绍如何实现mysql支持的高级功能.本节告一段落.
2 mysql(pgsql的现状和mysql差不多)
mysql***一般认为***有两种表类型
(myisam,innodb.当然不仅是如此了,好像接近10种.
偶自己主要在小规模应用时用myisam,大规模应用时用innodb(当然尽可能要把事务功能关掉)
最近有soliddb storage engine beta,可参见偶blog上对soliddb的新闻及评测.暂时的感觉不太好
参见:http://www.fcicq.net/wp/index.php/archives/103)
假设如果某论坛帖子数过多,需要进行分表,有许多的方式.
2.1 在程序范畴上进行修改,使其支持多表.
这方面的典型例子:动网论坛(dvbbs)
大家可能都听说dvbbs要有php版本,源码还没有发布.
但是大概的方式和asp的方式是差不多的.
在topic表中查找对应帖子所在的表.然后根据表名得到存储位置.
当然这种方式也有许多的缺点(比如topic表过大的问题,可以看看merge表的部分.)
但是应该都是可以克服的.
2.2 merge表
大家看看mysql的手册就知道,merge表实际上就是许多相同表结构的****myisam****表的集合(确实不支持innodb).
这个方式有个优点.同样引用论坛的应用情况说明一下.
比如1年前的老帖子,你可以把这些帖子倒入单独的myisam表,然后使用myisampack来压缩(压缩率约为60%).
然后将原来的表做为merge表.这样能够大大减小数据库开销
缺点也是有的,如果要修改数据库结构,几乎不可能(除非导出,重新导入,然后再进行操作)
2.3 分区表(mysql 5.1新功能)
仍然是***myisam***表的集合,但是相对来说实现了自动化.把上面的分表工作自动化了.
但是同样遇到了许多缺点,同样的,也不易修改结构.建立表后需要重新导入数据.
偶个人认为分区表肯定不如merge表.如果分区表支持innodb那就是另一回事了 - 自己写程序避免不行吗?
3 成功的例子:
虽然mysql只适用于中小型数据库(这话不对.但是也只能这么说),
但是还是有人利用它做了大事情.
最典型的就是livejournal(lj).
他们的成长历程估计已经有许多网站转载过了.
如果需要看看大规模的应用例子的话,他们就是典型.
他们的工作都是开源的.包括经常被使用的memcached.这里就不多给人做广告了.
ps:这种文章偶是不太好意思转载的...呵呵.
4 如何用php实现merge表和分区表的功能(sqlite,低版本mysql适用)
主要解决两个问题,一个是插入,另一个就是查询(更新,删除同理.)
引用lj的方案,有一台服务器专管分配id,并且分配存储区域.
(如果你**缺钱**的话,你可以用***奇偶数或者取余***,在服务器A上写1,3,5...)
大概就这么回事...
(第一种方式)比如查询:
select dbid,id from id2db where id=xxxxx(或者用username='abc'?)
然后得到dbid,再到相应的服务器去取.
第二种就相当简单了.这里不赘述.
如果想实现分区表的话插入就更简单了.
取出的时候要注意数据库的***数据范围***
(如存储的数据是05-06年的,那么查询的时候就不要查到别的表去.)
mysql5.1解决了这个问题,希望你也能解决 :-)
提示:你可以用一下unixstamp(或者干脆比较日期)来解决这个问题.
文章就到这里.感觉有点小小的跑题.不过偶相信对各位是有帮助的.
课后题:
有一个数据库,里面有4个表.里面是数据的日期范围
tableA 03-1-1 04-1-1
tableB 04-1-1 05-1-1
tableC 05-1-1 06-1-1
tableD 06-1-1 ......
如果用户查询03-3-1 到05-3-1的数据,你要选哪些表?如何排序?
(提示:union)
版权声明:喜悦原创首发,禁止随意转载.
如果本文有错误或其它方面的问题请联系:fcicqbbs AT gmail DOT com.
再次小广告:继续征友情链接.技术类优先....最后几天啦...欢迎访问偶blog一逛,签名里有.
最后一句话,本文是偶最后一次参加本活动的收笔之作.下次机会就都让给各位了....
|  学科
|
|