这样的一个SQL:select *
  from base_book_1  a, base_book_2 b
 where a.bookid =b.id
   and a.channelid = 2
   and b.status < 5a.channelid的数据分布:                                
333524 1              
134253 2
176078 3
46537 4
56259 5
64538 6
12197 7
36751 8b.status的数据分布: 
181           1
619084           2
2426           3
942           4
378           5
191           6channelid和status都创建索引,但由于数据倾斜度大,有时可能不走索引。关键是b.status取值小于5,该部分一定会走全表。对数据库性能造成
比较大的影响,时常观察到cache buffer chains的出现。目前开发人员也刚接手这个遗留项目,不清楚如何优化,如果从SQL角度该如何处理这样的业务逻辑?或者提出什么建议

解决方案 »

  1.   

    select *
      from base_book_1  a, base_book_2 b
     where a.bookid =b.id
    and b.status <=4
    and a.channelid = 2
    试一下    
      

  2.   

    其实我觉得并不是要让b.status走索引,即便走了索引,取的数据那么大,走全表会更适合。我觉得从SQL上去优化似乎不太好做,而是想从业务角度这块去考虑,但毕竟没做过开发,不知到如何与开发人员沟通,他们的想法是能直接给个方案。不知道大家如果要处理类似的业务需求时,会用什么办法?当初设计这条SQL的开发人员肯定没有考虑效率问题。以至于现在性能很差