索引是一把双刃剑,用好了,万事ok,用不好屁用不起:
1. 当两张表需要经常关联时,同时大数据的表,索引基本无效,一大一小尽量走大表索引,避免全表扫描。
2.当一张大表存在,且不允许有重复纪录,使用索引组织表。
3.一张表多个字段经常用时,需要联合索引。
4.一张表最长用一个字段,用唯一索引(Unique)
大致就这么多,没什么高深的问题,要保证你的sql语句的执行计划(explain plan)走索引的道路,否则和没建一样,只要根据你的经验判断,这张表的使用情况,这样在建索引就不会盲目或无效。

解决方案 »

  1.   

    根据Oracle优化路径
    rule 模式下的规则:1、有两个索引存在的情况下,from后面大表在前。小表(返回记录少的表,不是记录少的表)在最后,作为驱动表,Oracle处理SQL语句是从左到右2、有一个索引,则顺序无关3、都没有索引,则大表应该在后
    要根据有无索引,详细如下:表A有N行数据,符合连接条件的行树为A1,表B有M行数据,符合连接条件的行树为B1 
    1.A,B两表均无索引 
    如果A表驱动,则A表扫描一次,B表扫描A1次.   磁盘访问次数为:N+A1*M;                
    如果B表驱动,则B表扫描一次,A表扫描B1次.    磁盘访问次数为:M+B1*N; 
    2.A表无索引,B表有索引 
    如果A表驱动,则A表扫描一次,B表查A1次索引. 磁盘访问次数为:N+A1*LOG(M)/LOG(2);      
    如果B表驱动,则B表查一次索引,A表扫描B1次.    磁盘访问次数为:LOG(M)/LOG(2)+B1*N 
    3.A表有索引,B表无索引 
    如果B表驱动,则B表扫描一次,A表查B1次索引. 磁盘访问次数为:M+B1*LOG(N)/LOG(2);            
    如果A表驱动,则A表查一次索引,B表扫描B1次.    磁盘访问次数为:LOG(M)/LOG(2)+B1*N      
    4.A,B表均有索引
    如果A表驱动,则A表查一次索引,B表查A1次索引. 
    磁盘访问次数:LOG(M)/LOG(2)+A1*LOG(N)/LOG(2);
    如果B表驱动,则B表查一次索引,A表扫描B1次.   
    磁盘访问次数为:B1*LOG(M)/LOG(2)+LOG(N)/LOG(2)