本帖最后由 xiaosha1984 于 2011-03-09 11:42:53 编辑

解决方案 »

  1.   

    比如,上一篇,下一篇的功能        $prevquery = $_G['db']->query("SELECT id,title,alias,url FROM ".tname('article')." WHERE {$cidwhere} (sortid>'{$article['sortid']}' OR (sortid='{$article['sortid']}' AND id>'{$article['id']}')) AND status='1' AND ischeck='1' ORDER BY sortid ASC LIMIT 1");
            $nextquery = $_G['db']->query("SELECT id,title,alias,url FROM ".tname('article')." WHERE {$cidwhere} (sortid<'{$article['sortid']}' OR (sortid='{$article['sortid']}' AND id<'{$article['id']}')) AND status='1' AND ischeck='1' ORDER BY sortid DESC LIMIT 1");访问两端的文章比较快,如果访问中间的文章,则超时,问题语句在上一篇的那个ASC 上
      

  2.   


    文章ID不是已知的么?比如现在查看的文章ID是100,那么下一篇就是ID=101,上一篇就是ID=99,为什么要用这样的ORDER BY,再LIMIT 1呢?
      

  3.   

    还有,后台管理的分页,由于MYSQL自身的LIMIT的特性,偏移量越大,选取越多,每页10条,1000页以后基本上无法访问,
    只能用这种语句,                $query = $_G['db']->query('SELECT id FROM '.tname('article')." ORDER BY id DESC LIMIT $start,1");
                    $value = $_G['db']->fetch_array($query);
                    $query = $_G['db']->query('SELECT id,uid,username,cids,title,alias,url,sortid,iscommend,viewnum,commentnum,status,ischeck,dateline FROM '.tname('article')." WHERE (id<'{$value['id']}') ORDER BY id DESC  LIMIT $pagesize");这样就不能查看排序的效果了,比如进后台想查看所有已经发布的,按评论排序,按排序值排序,按查看次数排序==
      

  4.   

    文章会删除的,ID非连续,而且一旦文章按照排序值来排序,这样,文章的上一篇下一篇的ID更无规律
      

  5.   

    5楼:
    limit 5,11                            5----11
    查找 某个作者 已经发布且通过审核的文章 -------首先按7楼说的对表分区,然后在作者id或用户名上加索引即可,
    然后把查询变成 查找 某个作者 ,某个时段 已经发布且通过审核的文章,查询时有了这两个索引的筛选,剩下的已经没有多少条数据了,可以去除掉这个索引了 KEY `status_index` (`status`,`ischeck`,`sortid`),  -------当然这只是我的看法。查找某个分类--------可以先查出来放入临时表,或者另一个表,或者某缓存。然后定期清理更新这个表。