第一个问题不晓得第二个,加sleep(1)没用,一般是限制二次查询的时间间隔。

解决方案 »

  1.   

    第一个问题:弄个文本缓存查询结果,如果是同样的查询条件直接从文本读取。第二个问题解决方法很多,比如用SESSION或是COOKIE存进去lastSearch时间,当他再次查询时比较一下时间差。也可以得到他的IP地址,如果查询过多,屏蔽其IP查询。不是APACHE,是PHP的屏蔽,弄个文本存入恶意查询的IP,查询之前判断一下。
      

  2.   

    "这种情况一般是不适合建立索引的",不知道你这个结论是怎么得来的"防止有人恶意频繁查询",可以用cookie,记录上次查询的时间,和现在的时间相比对。
      

  3.   

    TO: feel8(准备早起的鸟) 
    如果对方连续刷新,用sleep(1)是否可以起到最多每秒一次?TO:mistjin(9527@孙燕姿资深粉丝) 
    文本缓存是个好主义! SESSION记录的办法我想到过,就是觉得有些麻烦~TO: ccterran(iwind) 
    SQL查询优化基础上来的(不知你的星怎么来的);COOKIE在客户端,防止恶意攻击的话明显不明智。
      

  4.   

    我晕,我倒是长见识了,佩服佩服。
    按照你的说法:数据少是没有必要建索引的,数据多又不适合建索引,那说明索引就是没有用的,那我们还要它干什么!?不明白,请指教。sleep(1)更不理智。我只是说原理。
      

  5.   

    连续刷新用sleep只是让他的多次查询都停一秒,一秒后继续执行查询。该是多少次就是多少次。用session限制,拒绝一定时间内的多次查谒请求,减少数据库负担。like '%keyword%' 用索引好像没用,具体怎么查更好不清楚。
      

  6.   

    既然需要提高效率,必须避免like操作,实在不行,也要提出关键字来检索!
      

  7.   

    TO:ccterran(iwind)
    我没说不用索引是因为数据多,而是带有左右匹配的LIKE语句不适合做索引~TO: feel8(准备早起的鸟) 
    还是不大理解,假如用了sleep(1),一个人刷新,一分钟刷新了1000次(注意是一分钟内),那么是不是要等到10多分钟后,服务器那边还在运行他的查询?我的理解是,他查询了一次,在1秒中内如果再运行了一次查询的话,上一次的查询就在SLEEP没结束时就中断了。可能我的想法不对,但如果真这样的话,SLEEP还是起很大作用的。
      

  8.   

    sleep(1)只是让当前的php进(线)程停止一秒后再运行“我的理解是,他查询了一次,在1秒中内如果再运行了一次查询的话,上一次的查询就在SLEEP没结束时就中断了。”
    你的这个理解是错误的
    每一次刷新浏览器都将产生一个http请求
    虽然浏览器不再等待前次刷新的结果,但前次的请求已经发出了
    web服务器在收到http请求后会产生一个php进(线)程来处理请求的内容
    只是前次的http请求已经断开了,处理的结果已经无处输出了。
    所以php中有一开关,用于控制当连接中断后程序是否继续进行据此,使用sleep函数不能解决这个问题。要使用session才行
      

  9.   

    TO:xuzuning(唠叨) 
    “所以php中有一开关,用于控制当连接中断后程序是否继续进行”,这是一个KEYWORD,一般的服务器这一开关应该是不继续进行的吧(也没有继续进行的必要)~
      

  10.   

    就算是记录上次查询时间,我觉得SESSION和COOKIE同样脆弱,客户端很容易新开无数个会话~
      

  11.   

    用session不行吗? 用cookie的话不按正常方式提交表单还是可以刷。
      

  12.   

    SESSION一样,举个例子,新开个IE窗口,里面的SESSION数据全空~
      

  13.   

    既然这样,操纵Session,把Session数据保存到数据库里面可以了吧!