数据库Oracle11g
--------------
name字段已建索引
原sql:(由于使用了like,并且内容前有百分号,默认是不使用索引的)
select id from user where name like '%admin%';修改后sql:(强制使用索引,实际结果确实使用了该索引)
select /*+INDEX_ASC (user NAME_INDEX)*/id from user where name like '%admin%';--------------
问题1:像这样强制使用索引进行like检索时是否真的缩小了检索范围而达到使用索引应有的效果?如果没有,如何修改?
--------------
问题2:排序+分页查询当前常用的方式为三层嵌套sql,内层排序、查出所有记录,中间层过滤超过最大值的部分,最外层过滤小于最小值的部分,但此法无可避免的使用了全表查询,这该如何避免?希望能提示下思路,直接给出示例sql更好。
--------------
谢谢大家!
--------------
name字段已建索引
原sql:(由于使用了like,并且内容前有百分号,默认是不使用索引的)
select id from user where name like '%admin%';修改后sql:(强制使用索引,实际结果确实使用了该索引)
select /*+INDEX_ASC (user NAME_INDEX)*/id from user where name like '%admin%';--------------
问题1:像这样强制使用索引进行like检索时是否真的缩小了检索范围而达到使用索引应有的效果?如果没有,如何修改?
--------------
问题2:排序+分页查询当前常用的方式为三层嵌套sql,内层排序、查出所有记录,中间层过滤超过最大值的部分,最外层过滤小于最小值的部分,但此法无可避免的使用了全表查询,这该如何避免?希望能提示下思路,直接给出示例sql更好。
--------------
谢谢大家!
如果在最内层使用rownum < x,再加上排序,出来的rownum就是乱序,外层再一截取,就不对了,会造成查出重复数据的情况。
我用的是oracle呀。
like条件中以%起首即使走索引,也是全索引扫描再加table scan by rowid,如果索引只是在name上的而且符合条件的记录超过全表记录的20%,那效果通常还不如直接走全表扫描。如果只是要优化这一句查询,那是很简单的,删除name上的索引,建一个包含name和id的索引,那该查询就完全走索引(虽然是全索引扫描)而不会去读表,效率应该高很多。