This topic created in 4682 days ago, the information mentioned may be changed or developed.
我是用PHP写后台程序的新人。。最近在给自己的博客写搜索功能。
在网上浏览的时候,发现有种不用Query String(这个大概就是?=XXX的通过搜索地址传输的方式吧)的方式。这种方式在数据库内生成搜索结果,然后返回成类似1、2、3的id号,然后用uri调取id号,由此取得搜索结果。。不知道我讲清楚没。。
这种方法固然很好——尤其对中文搜索,不用一大堆可怕的字符,同时通过存储到数据库,搜索者也可以将搜索结果存到书签栏。
但我担心这种方法会产生如下问题:
1. 数据库会不会变得过大。
2. 会不会让网站更不稳定?(比如不停的让数据库存储新的搜索结果。。)(假设我已经对XSS攻击有很好的防范了)
3. 需要隔一段时间就把搜索表清空一次吗?(如果这样。。书签肯定就都没效果了。。)(而且如何让MySQL针对某个表三个月或是一年清空一次?当然也可以写PHP代码规定存储量超过多少就都删了。。)
- -!最近感觉不是一般的笨了。。以及真的是才学PHP没太久。。不要喷得太厉害了谢谢。
10 replies • 1970-01-01 08:00:00 +08:00
 |
|
1
ksc010 Jul 27, 2013
不是很明白 是不是说 我搜索 name=jack&max-age=20 而程序把这个条件存储起来,并且有个key 比如是23 这样我访问 search.php?key=23 实际上就是 search.php?name=jack&max-age=20
|
 |
|
2
Windweller Jul 27, 2013
@ ksc010 嗯。。我用的是uri处理。。所以最后结果看起来是search.php/23/。。基本思路就是把存储条件给存进数据库里。
|
 |
|
3
ksc010 Jul 27, 2013 1
有大站这样用么 我知道的是ecshop搜索的时候 先把搜搜条件给base64成一长串字符 看起来就像是这样search.php?encode=YToyOntzOjgDoic2VhcmNoX2VuY29kZW1lIjtpOjEzNzQ4OTA4OTA7fQ==
|
 |
|
4
qiayue Jul 27, 2013
注意,你写的是博客程序,就自己一个人用的程序,访问量能大到哪里去,每天几十万 UV 算是顶天了,估计一开始每天几百个上千个 UV 就不错了。
你所有的担心都是猜测而已,不是实际发生的,完全没必要提前去优化。
另外,反而,有些访问量很大的网站(比如电影天堂),他故意这么做,因为他把搜索结果给缓存起来了,网站用起来更快了。
|
 |
|
5
rwx Jul 27, 2013
这种方式一般是缓存起来避免同条件搜索的时候翻页还要再次检索数据库吧? 个人博客的话不是访问量超大或者数据量超大基本用不上这种优化方式。 而且直接使用google站内搜索会更好。
|
 |
|
6
Windweller Jul 27, 2013
@ qiayue 是缓存的搜索结果,而不是搜索字符吧?(我目前只知道存搜索字符的方法。。)请问搜索结果是怎么存到数据库的呢?
|
 |
|
7
darasion Jul 27, 2013
撸主不必担心这事儿。甚至也不需要缓存啥东西。因为一个人做的不可能搞这么多东西进去。 放心,如果你的访问量上来了也许你就开始雇人做事当老板了。 即便是访问量和数据量巨大,也是有办法的。 中国的网页总数,也就 几个1000000亿 左右,都有办法存的。
|
 |
|
8
shinwood Jul 27, 2013
可参见 Discuz 对帖子搜索的缓存机制,用一个search 表缓存搜索到的帖子的 tid,显示到前端用 WHERE IN 的方式,这种情况可能适合搜索的帖子不是百万千万级的,不然搜索表够大。
至于定期清空就更容易了,在 search 表中加一个 expiry 字段,设定失效秒数,后台定期手工运行或者写个清理 hook 到程序中即可。
|
 |
|
9
shinwood Jul 27, 2013
可参见 Discuz 对帖子搜索的缓存机制,用一个search 表缓存搜索到的帖子的 tid,显示到前端用 WHERE IN 的方式,这种情况可能适合搜索的帖子不是百万千万级的,不然搜索表够大。
至于定期清空就更容易了,在 search 表中加一个 expiry 字段,设定失效秒数,后台定期手工运行或者写个清理 hook 到程序中即可。
|
 |
|
11
Loveyuki Aug 1, 2013
小型网站怎么做都不会出现太大的性能问题。
大型网站肯定实现了自己的搜索引擎,也不会纠结于此。
所以如果你喜欢这样就可以去试着做做看。要勇于尝试。
|