我有一个表(几百万到一千万)其中有五个字段是作为查询条件的
create_time DATE 时间随记录创建时产生
log_sort SI   种类大概就几十种
org_id  I    单位号根据用户创建单位数而定,应该两位数以内
file_id VA(50)    文件号不定,根据用户使用情况增长
user_id I    用户id,应该3位数以内
....
....
请问我应该怎样建立索引,来优化查询速度。我想建立多列索引,但是根据用户的选择字段的匹配不定。
所以不知道该怎么建。
例如 建了(user_id,org_id,log_sort)后,只适合
user_id
user_id,org_id
user_id,org_id,log_sort的查询,其他情况索引不起作用。而且建立索引后,定位少量结果集的速度是提高很多,但是当返回大量结果集的时候就不是那么快了~这是为什么?而不建立索引的时候,返回大量结果集(几十万)时又很快。
希望有经验的前辈能提些意见!谢谢~

解决方案 »

  1.   

    根据后台代码的设计匹配的可能性要么是有org_id,要么有user_id。其他的都有可能,这样这是为了减少匹配项。有人跟我说:把所有条件都加上匹配,比如user_id如果为空(即不匹配)但还是把它放进去用“”来匹配。
    我感觉这样应该不太好吧~
      

  2.   

    索引的建立要看具体的情况,分析一下那些sql执行的次数多,索引不能建立的过多,否则影响更新和插入的速度。
    定位少量结果集的速度是提高很多,但是当返回大量结果集的时候就不是那么快了-----这个问题已经说过了,不是你建立了索引,数据库就一定会使用,返回的结果如果大的话,就会进行全表扫描,这个时候不建立索引会比较快。
      

  3.   

    我现在建了一个(userid,create_time,sort_id)的索引但是
    userid+sort_id的查询很慢~包括org_id+其他的比较慢~因为没有走索引嘛~~~我是不是再建一个org相关的索引的呢?然后根据查询条件的不同走不通的sql
      

  4.   

    找出执行多的sql,然后看sql的执行计划,在确定如果建立索引。
    用explain察看sql的执行计划。
      

  5.   

    再请教一下~我再给这张表建一个多列索引~行吗?因为匹配的情况很多~这是一个审计表~再建一个可以覆盖更多的查询匹配可能~但是我担心索引多了会影响效率我打算再建立一个(org_id , create_time,sort)的索引
      

  6.   

    可以创建一个单独的org_id索引