现在有一个栏目表(6万条)和软件表(300万条)。系统要求传入一个栏目id,在软件表中查出所有该栏目和子栏目的软件信息。现在采用方式是在软件表中有个一字段pathlist(varchar,已建索引)保存软件所属栏目的路径(例如:1,4,9,54,246,8813,64513)。
系统需要分页查询第一页
select [id],[title],[createtime],row_number() over(order by id desc) as [row_number] from tb_soft where [pathlist] like '1,4,9,54,%' and [row_number] > 0 and [row_number]<20现在的情况是查询顶级栏目0毫秒,查询子栏目一般在100毫秒。
但是分页需要一次count查询,顶级栏目1秒左右,子栏目70毫秒。请问一下现在这样数据设计有没有问题,还有没有更好的设计方法。还是要求传入栏目id,就可以查询该栏目和所有子栏目的软件。如果该设计可行,怎么能提高性能。比较count查询的1秒简直无法接受。手头没有分了,不好意思。望高手解答在此,谢谢。

解决方案 »

  1.   

    在大数据量中 pathlist 用like 及时有索引也没有意义,你可以用instr来替换like
      

  2.   

    '1,4,256,%'这种Like不是符合SARG规则吗???这种写法索引应该是生效的,‘%9483,43,%’才不生效吧!!
      

  3.   

    instr的效率比like要高一些,因为instr并不是模糊查询,
    楼主说的没错,当通配符(%)在后面的时候,oracle可以使用索引,
    但是instr也可以使用索引啊,所以还是instr的效率高一点吧!
    楼主可以试下
      

  4.   

    不应该,100万条记录做个count(1),也就是直接就出来了。
    单独做count(1)