日期:2011-05-31  浏览次数:20408 次


在一个PHP的论坛上看到了这样一个贴子,索引将答案贴到这里让大家看看,希望对大家有帮助

quote:
--------------------------------------------------------------------------------

当数据库很大如10万条,1GB大小时,怎样搜索才高效?
请问版主,我现在在调试一个论坛,向数据库中写入了10万多条信息,此时主要的内容都集中在一个表上,有近1GB大小。
搜索该论坛时很慢,特别是全文搜索时,即使只用
SELECT * FROM `cdb_posts` WHERE message='本破烂陈旧的小册子从怀中取出递给我'

也很慢,在台式机上甚至根本运行不完。但我听说sun公司的论坛(下面有近百个分论坛)进行全文搜索时也不超过20秒,我们能否做到。

我运行搜索程序时,cpu和内存占用率都很低,只有硬盘灯一直在闪,我总认为是程序不够高效,是不是可以把程序写出类似“多线程”,以提高效率。

请版主和各路大侠指教!
谢谢。

--------------------------------------------------------------------------------

 

有人建议它用ORACLE

我觉得有一点大家要注意,那就是如果你让oracle执行一个 select * from xxxx where xxx = 'xxxxxxxxxxxxxx';

这个表有1G的时候绝对不会比MYSQL快上多少。

现在的这么多流行的数据库系统上执行相同的操作时不可能快上很多倍的。

关键在于你的数据库设计。

我在做一个商业信息的搜索引擎,在做的过程中得到一些经验。如下:

1。 建立摘要表
2。 对于那些数字形式且经常查询的数据一定要建立索引,我不记得在哪里看到一篇贴子说什么:“不要用那垃圾的索引”.郁闷了N久。这种贴子都有。。哎。
建议: 在where中的用到的尺寸不大的condition一般都要索引。尺寸大的单独表中存储且要用like查询的单独表中存储。
3。 对于有很多结果的时候不要select *... ,先select ID.... 然后取得ID后进行分页控制,取出当前页中的ID到数组。。 再执行select * from xxx where ID in(implode(',', $ID数组);
如果得到的数据还要进行join,请在这条select 语句中来进行。因为这样数据库进行join的选择因子会小很多。

4。对于要全文检索的数据和现在的数据分离出来。以数据库设计中第二范式的形式表示.在单独表中存储和数据主键对应的信息.

5。给表加上一个primary , int(smallint、tinyint 看要多少条数据).

6。在做好系统后用explain select .... 对系统中耗时的语句进行分析。看看MYSQL是如何处理这条语句的。

7。如果有可能,把信息分表存储(也可分布在不同的数据库服务器上)

本人禺见,觉得好的顶一看。。觉得差的就当是看个笑话。。。

__________________

本人回答的问题,如无特别注明, 均未测试过....