索引的问题,这种情况是使用复合索引还是单个索引?? 高手快来
oracle9i
create table test(
id number(9),
mobile varchar2(15),
service_name varchar2(20),
service_id varchar2(20),
content varchar2(400),
get_time date);
这个表以后可能要有几百万的数据,以下是经常要用到的查询语句
select * from test where mobile= 'xxxxx ';
select * from test where id=xxxx;
select * from test where service_id= 'xxxxx ';
select * from test where to_chr(get_time, 'yyyymm ')= 'xxxx ' and mobile= 'xxxxx ';
select * from test where to_chr(get_time, 'yyyymm ')= 'xxxx ' and service_id= 'xxxxx ';
第一个问题:如何建立索引才能达到很好的查询效果?
第二个问题:get_time字段建表时是用date类型好,还是换成varchar2类型好,那种会让以后的查询更快?
------解决方案--------------------id mobile service_name service_id get_time
分别建立索引
时间最好用data 不过查询的时候 不要to_chr(get_time, 'yyyymm ') 而应该 get_time between
a and b
运算后用不到索引
------解决方案--------------------1.检查要在一起查询的字段建复合索引
2.service_id,get_time,mobile建立复合索引
------解决方案--------------------复核索引必须使用前导列,才能被使用上,否则select的时候,用不上索引
------解决方案--------------------id如果是主键会带主键索引如果不是就独立建索引;
mobile 和 get_time建一组索引;
service_id 和 get_time建一组索引;
查询时把get_time写在mobile或service_id的后面,否则用不上索引,任何查询字段最好不要做运算,做了运算的字段用不上索引;
索引多了会影响插入效率,但是在常用查询字段上建索引可以及大提高查询速度,同时有没有对插入造成的影响在可以容忍范围内的话,多建几个索引也可以,不过要是每个字段都建就没意义了,索引这东西要根据需求来追求查询效率和插入效率的一个均衡
------解决方案--------------------1、ID若为主键就不需在索引,否则在ID上建一个
2、mobile 和serice_id各建一个索引
3、get_time是否要建根据你的数据的分布,若同一个mobile下的get_time有多少,一般不需要在建了,