现在做了一个新闻系统。可是数据库设计不太合理,所以现在每天都会出现死机的情况,想请教高手如何调优。
   情况是这样的:
   有一个新闻系统表,
   新闻(ID,标题,新闻内容,发布人,发布时间,访问次数,最后访问时间)
   因为一条新闻可能发布到多个频道中,所以有一个新闻映射表
   新闻映射(ID,新闻ID,标题,发布人,发布时间)
   这两个表的数据,
   新闻表有30多万,映射表有60多万
    
   每看一条新闻的时候,都需要设置新闻的访问次数,即需要
   update 新闻 set visit_times = visit_times + 1, visit_date = now() where 新闻ID=ID
   
   如果第一次访问该新闻,需要读取新闻的信息
   select 标题,内容,发布人,发布时间 from 新闻表,映射表 where 新闻ID=ID AND 新闻映射中新闻ID=新闻表ID
   
    后来发现,如果访问量太大,则会出现update 新闻表时出现锁定。我想可能是因为有正在读新闻表的时候,却又在UPDATE,造成了死锁。
    因此我想增加两个表,新闻内容表,保存新闻内容,新闻相关表(新闻ID,保存访问次数,访问时间)
    这样,UPDATE只是写新闻相关表,而不需要写新闻表。应该就不会造成死锁。
    但是,这样的话,查询就会有三个表联查
    select * from 新闻表,新闻映射表,新闻相关表(主要查访问次数)where 新闻映射中新闻ID=新闻表ID AND
    新闻相关表ID=新闻ID
    
    这三个表都有索引,几十万条数据查也很快,但是这样联合查,索引还起作用吗(好象建立外健应该还有用)?
速度能跟的上吗?
    
    
    这样update的时候,还会锁定吗
       
   
   

解决方案 »

  1.   

        update   新闻   set   visit_times   =   visit_times   +   1,   visit_date   =   now()   where   新闻ID=ID 
          
          如果第一次访问该新闻,需要读取新闻的信息 
          select   标题,内容,发布人,发布时间   from   新闻表,映射表   where   新闻ID=ID   AND   新闻映射中新闻ID=新闻表ID 
          第一个UPDATE 语句里面
    给ID 加上索引。
    第二个SELECT 语句改成LEFT JOIN。
    然后加上相应的索引。
    至于如何加相应的索引。用EXPLAIN 一下就知道了。
      

  2.   

    select   *   from   新闻表,新闻映射表,新闻相关表(主要查访问次数)where   新闻映射中新闻ID=新闻表ID   AND 
            新闻相关表ID=新闻ID 三个表如何查询呢,
      

  3.   


    新闻表 a
    新闻影射表 b
    新闻相关表 c
    select * from a left join (b,c) on (a.id = b.id and a.id = c.id);
      

  4.   

    奇怪,为什么我
    select * from a, b where a.id=b.f_id(f_id保存的是a中的ID值)
    和使用
    select * from a left join b on a.id=b.f_id
    两个查询的纪录数不一样,后者要多一些
    而且后者的时间也要多一些
      

  5.   

    第一个是内连接 即INNER JOIN ,两表记录中的KEY字段必须匹配才显示
    第二个是左连接,以A表为准,不管是否与B表中的KE字段(ID)
    匹配都显示出来,A表记录>B表记录数。
      

  6.   

    前者是inner join .
    后者是 left  join .
    肯定后面的多。
    这样就一样了
    select   *   from   a   left   join   b   on   a.id=b.f_id  where b.f_id is not null
      

  7.   

    select       *       from       a       left       join       b       on       a.id=b.f_id     where   b.f_id   is   not   null
    A有,B也有 即INNER JOIN