[字号:  ]

其实查询下数据库死不了人的

发布时间:2008-11-15 23:36   作者: 彪形大汉   信息来源: PHPChina 开源社区门户
看DZ的代码有感。DZ太不相信数据库了,太相信COOKIES,写数组文件等缓存方式了

如果一个数据写一次缓存还读不了100次又要查询数据库重新更新的话,还不如读数据库了

最新回复

syb328 at 2008-11-15 23:40:33
其实你要这样想,如果数据量达到万以上级别的时候,查询数据库就会很慢,多个查询肯能会死,所以,能不能查询就不查询。。
彪形大汉 at 2008-11-15 23:40:55
比如进一个DZ的版面,这个版面的名称,比方叫 fname,如果用都数据库的方式

$fname = $db->result_first("select cdb_forum where fid='$fid'")

查询一下就能获得版面的名称,DZ是把所有的版面名称和ID写进一个数组,然后用数组取得版面名称
liexusong at 2008-11-15 23:44:19
随着硬件的发展,查询数据库不是什么问题!不过现在好像有点慢~
idgnarn at 2008-11-15 23:46:44
当然是数组来的快
查询一次数据库的代价是很大的
某个人 at 2008-11-16 00:02:17
其实举个例子就容易理解了。。
一个做得好的DZ论坛有多少人访问论坛?
1000人?10000人?差不多吧?
是同步的哦~我按照一个人访问论坛查询数据库10此。多少次?
光同时在线就得访问数据库10000次以上!不是数据多少的问题。我不说服务器吧。光说你自己的电脑。你执行个循环到10000次,然后一天每时每刻都执行这个命令。会是什么后果?
现在大多搭建DZ论坛的不是独立服务器,而是虚拟机。一台电脑我按10个论坛算(这已经是非常小了。。有些100个都是少的)。每个论坛都做得不错。在同一秒情况下会对数据库执行多少次操作?
如果你的应用程序是个多人访问的。减少数据库查询是非常必要的。当然。。你做个OA。就公司里几百人访问。减少数据库查询是次要,对数据库优化成了最重要的了。因为都是百万级的数据库。。。
彪形大汉 at 2008-11-16 00:08:52
如果论坛像天涯那么大,几百个版面,光保存各个版面的数组就要占很大的内存,并且每次也要取读这个数组啊

取读数组比取读数据库要好很多吗
idgnarn at 2008-11-16 00:11:40
当然读数组与取读数据库有几十倍到几百倍的差距
文件读写是很快的
某个人 at 2008-11-16 00:16:03
没有深入研究过效率问题。但从直观上。
mysql在数据库上的运行本身就要消耗服务器的内存等资源。
我建议你看看数组是如何存储的。
不太记得了。。当时看think in java 的时候讲解过。。数组等变量是直接存储在内存里面的。内存在任何系统都是数据交换最快的!并且访问一个数组是只访问他的内存引用。而不是数组本身。访问结束后马上释放系统资源。
所以访问数组肯定比访问数据库要快。
以现有的硬件来讲。在我眼里,数据库单纯只是用来纯粹元数据和数据之间的关系的。查询能少则少。效率才会高
彪形大汉 at 2008-11-16 00:18:05
如果把缓存写进文件,而这个文件长度不超过1K,分别用fwrite和file_put_contents效率差别大吗?

我看DZ都是用的fwrite,但是用file_put_contents更方便啊,一行就搞定了。用fwrite还得先打开文件,然后获得文件首,然后写文件,然后再关闭文件
彪形大汉 at 2008-11-16 00:20:54
但是读写数据库至少比读写文件要快很多吧,会不会也是几十倍到几百倍的差距?

以前的cgi不就是文件型存储数据的吗?雷傲还是用cgi写的,后来被数据库型论坛给淘汰了
某个人 at 2008-11-16 00:23:28
我觉得这个和效率关系不大。而是在作用上。。。我没看两个方法。。等等。。我仔细看看。。
idgnarn at 2008-11-16 00:25:07
cgi是很慢的东西,不是因为文本慢
数据库相比读文件是很慢的。。。
说白了
数据库要访问硬盘然后处理,还有mysql和php之间还要沟通,php还要处理
而文本是php直接访问硬盘
idgnarn at 2008-11-16 00:26:48

QUOTE:

原帖由 彪形大汉 于 2008-11-16 00:18 发表
如果把缓存写进文件,而这个文件长度不超过1K,分别用fwrite和file_put_contents效率差别大吗?

我看DZ都是用的fwrite,但是用file_put_contents更方便啊,一行就搞定了。用fwrite还得先打开文件,然后获得文件首 ...
file_put_contents是PHP5函数,DZ要兼容PHP4
还有fwrite要快5%左右
某个人 at 2008-11-16 00:27:18

QUOTE:

原帖由 彪形大汉 于 2008-11-16 00:20 发表
但是读写数据库至少比读写文件要快很多吧,会不会也是几十倍到几百倍的差距?

以前的cgi不就是文件型存储数据的吗?雷傲还是用cgi写的,后来被数据库型论坛给淘汰了
安全性呢?易用性呢?你还要让所有使用这个程序的人都知道你的文件与文件之间的关联?数据库型全程是关系型数据库。亮点在关系型!很轻便的就能够描述两个表之间的作用。你觉得看资料是看表容易明白一点还是看一堆只有电脑才认识的代码强点?
某个人 at 2008-11-16 00:29:10

QUOTE:

原帖由 idgnarn 于 2008-11-16 00:26 发表


file_put_contents是PHP5函数,DZ要兼容PHP4
还有fwrite要快5%左右
感谢你的提示。呵呵~~还真不知道!
确实。你既然是看DZ代码。DZ的几乎每个功能都兼容php4的函数。在进行操作之前都判断是否存在php5的函数。如果不存在,调用php4的函数。在数据库链接类链接上就看得到。直接判断php版本来决定是否对数据进行强制编码等操作。
yafeikf at 2008-11-16 00:29:19
我相信文件来的快
彪形大汉 at 2008-11-16 00:30:39

QUOTE:

原帖由 idgnarn 于 2008-11-16 00:26 发表


file_put_contents是PHP5函数,DZ要兼容PHP4
还有fwrite要快5%左右
才5%的差距
以后一般就用file_put_contents了,当然如果只改一部分内容还是fwrite
某个人 at 2008-11-16 00:32:02
重点不是效率。。是兼容性。。。。。
idgnarn at 2008-11-16 00:33:12

QUOTE:

原帖由 某个人 于 2008-11-16 00:27 发表

安全性呢?易用性呢?你还要让所有使用这个程序的人都知道你的文件与文件之间的关联?数据库型全程是关系型数据库。亮点在关系型!很轻便的就能够描述两个表之间的作用。你觉得看资料是看表容易明白一点还是看一堆 ...
文本的淘汰不是因为这个原因
文本在并发读写情况下容易造成文件损坏和丢失
例如同时2个人发帖,但是需要存到同一个文件上,A存数据时会锁文件,B的数据就会丢失
还有文本的搜索效率很低(需要递归)
idgnarn at 2008-11-16 00:34:37

QUOTE:

原帖由 彪形大汉 于 2008-11-16 00:30 发表


才5%的差距
以后一般就用file_put_contents了,当然如果只改一部分内容还是fwrite
你就不会封装下= =bbb

    function writeto($filePath, $content){
        $handle = fopen($filePath, 'w');
        flock($handle, LOCK_EX);
        $result = fwrite($handle, $content);
        fclose($handle);
      
    return $result;
    }