这里我们不对这两种方式的效率进行对比我想大家都有各自的想法但是我想说明一个问题就是这两种做法的本质的区别PHPer习惯性地用数据库来处理而且有很巧的处理方式效率也很高!这种方式就是数据库查询而第二种方法是比较有特点的他认为数据库就是存放数据的地方具体的逻辑处理还要靠自己的逻辑
因此结论是第二种方法的使用者觉得自己强些因为数据的逻辑是他组织的!并且觉得PHPer的那种做法无非就是会查询数据库罢了所以他认为PHPer是草根级的只懂得操作数据库和排列页面(smarty搞搞那种)
说到这里我想大家都已经回忆了不少自己平时用PHP做开发的经历了吧是否发现大家确实都在操作数据库呢
那么我们来讨论下这个问题数据库不好吗?为什么我一直用数据库处理数据都没有问题我要说的是数据库是有问题的而且有很大的问题!当然这里我并不是说不能用数据库也不是在贬低数据库的性能而是我们没有充分认识到数据库所起到的作用
我的想法源起于这样一个事情有一次一个网站的技术总监问我为什么他们的网站那么慢要怎么办当时我的MSN里Zend总部的工程师正好在线我就问他PHP响应比较慢了怎么办?他当时直接告诉我数据库问题!肯定是数据库没有优化设计好所以我没有给那个技术总监确切的答案了因为他们的数据库设计我们是不能涉及的所以就给了大概的数据库优化的建议这样的事情屡次发生我就开始怀疑为什么Zend总部的工程师每次都跟我说是数据库的问题呢难道我们不能从PHP层面来解决这个问题吗?答案是不能!因为PHP目前的运行速度已经是很快了通过Zend的性能分析也能看到一个用户的点击PHP的运行时间只有%不到那PHP在干吗?它在等等数据库的查询结果这个方面在目前的PHP产品中有了很大的提高那就是Caching和网页静态化两个方案Caching可能大家会比较陌生但是网也静态化现在连PHP产品的用户都非常清楚了速度快容易被搜索到等等好处不言而喻开玩笑地说现在网站的主页实现网页静态化只需要硬盘足够大J至于Caching就比较复杂些也是大多数PHPer感到头疼的地方甚至于有些人会用C来实现因为Caching中的数据有效期验证查找提取更新等等都是比较难处理当然也有人会用数据库来处理Caching问题
所以当访问量激增的时候PHP架构的网站会出现的很多问题都因数据库而起数据库的同步问题还不算什么关键是数据库的响应速度会有指数级的降低这个问题我在月号LAMP发布会的时候问过MySQL的副总裁他当时也没有给我比较完美的答案(这也我的意料之中)因为数据库总会有瓶颈的除非是神仙数据库哈哈!
这里有个题外话LAMP大会的时候我跟Yahoo的一个技术高管聊的时候我问他Yahoo在选择MySQL还是Oracle的时候是怎么考虑他的答案令我非常惊讶他说大部分的时候我们是会用MySQL的因为它的性能已经达到我们的要求但是什么时候我们会选用Oracle呢就是当我们需要存储收费用户的数据的时候我就问为什么难道Oracle比MySQL稳定吗?他说这个倒没有特别考虑关键是如果使用Oracle的话当出现问题的时候我们可以找到负责人Oracle会负责事故的处理但是如果用MySQL的话我们找谁去?
所以我们对数据库的看法应该纠正过来就是说数据库不是万能的如果有实力的话自己开发数据库听说Google就是那样的
那么我们怎么看待数据库呢?我个人的理解是数据库只是用来降低开发成本的手段因为采用数据库以后我们不需要考虑数据的存储尤其是排序和查找但是这会带来什么问题呢?就是当业务膨胀的时候数据库就成为瓶颈了!这个时候问题就会非常棘手!因为这个是底层的数据处理牵一发而动全身
所以我认为正确的观点是数据库是一个数据备份机!怎么理解我们只需要保证数据的存储有效性就行了而这本来就是数据库的核心功能只不过因为数据库的方便的排序等功能让大家把过多的处理都交给数据库来操作了一个用户的点击PHP就把一大堆的任务交给数据库然后把结果排列下给用户就完事了这对数据库是不公平的!也是因此大家开始抱怨数据库的性能了
针对这个观点我们再举个例子有一次我去拜访一个大型的网络公司(基本上国内只要上过互联网的都知道)他们使用PHP很少但是我了解到他们其它业务是怎么使用数据库他们自豪地跟我介绍说他们在数据库的外围有个第二数据库(我这里起名叫第二数据库)为什么叫第二数据库呢原来它是一个缓存系统那么开发工程师怎么去这个缓存系统获取数据呢?那个技术总监自豪地说他们这个缓存系统由SQL查询语句!我当时很惊讶但是后来想想确实需要这个因为当你的缓存系统达到一定量级的时候从缓存获取数据都非常复杂干脆写个SQL查询语句让缓存系统分析处理并返回数据而且他们告诉我在他们那里就算是用PHP的话也是让PHP去那个缓存系统读取数据
所以说如果你能处理好这样的问题的话把数据存放在数据库然后数据库只起到备份的作用然后你用自己的中间层来处理分析数据效果是%以上的用户访问不访问数据库有人就会说了这不就类似连接池的东西吗?是的!因为数据库的瓶颈是无法解决的我们只能在Web服务器和数据库中间加个中间层来做缓沖
可能大家会说了切这个我们早就知道了!那好这里我要说的是它引发的两点思考
<![if !supportLists]>第一 <![endif]>有些语言已经有连接池技术的基础上那些程序员可以方便地使用连接池而构建大型应用那么如果他们认为PHPer只会是用数据库那么我们是不是可以说他们只会是用连接池呢?连接池和数据库在这个概念上有何区别?
第二 当PHPer开始构建自己的缓存系统的时候他是不是突破了PHPer只会是用数据库的层次?因为他参与了数据逻辑的处理工作那么他还是草根吗?
最后新一代的PHPer是草根吗?
[] []