首页 » DB » 正文

索引查询和排序的SQL

问题SQL:

select *
from table_name
where TIME <= ?
order by ID
FETCH FIRST 100 ROWS ONLY

TIME有索引,ID是主键,DB性能有严重的压力。

通常认为TIME和ID都有索引,而且限制条数,应该不会有压力,仔细分析,查询使用TIME, 排序使用ID,根据B+树索引,查询出来的所有记录都需要再按照ID进行排序,即使ID有索引,也无法利用索引,因为记录是按照TIME的维度搜索的,不是一个维度。

优化SQL:

select *
from table_name
where TIME <= ?
order by TIME
FETCH FIRST 100 ROWS ONLY

查询索引和排序索引是一个索引的话,从B+树的一头拿数据即可,不用再排序。

总结:

1. 用索引1查询,用索引2排序,无法利用索引2,需要重新排序,用同一个索引查询和排序就直接不用拍排序了,从b+树一头拿数据就行了
2. 虽然用索引查询和排序,但是索引和排序不是一个维度,数据库需要在查找数据范围内进行全排序,才能确定前100条

参考:

http://www.cnblogs.com/zhaoyl/archive/2012/05/04/2483513.html