一、什么时候创建索引?
索引多并不意味着性能好,索引对查询有利 对DML是有负担的.
A.一个字段包含一个较大范围的值,也就是说重复率比较小,就是所谓的高基数列
在一个大范围内去找小范围或精确的单个或几个值时 ,
索引非常有效,高基数列适合作索引 ,低基数列不适合作索引
B.一个列包含大量的NULL值
索引是不存NULL值的,那也就意味着这个索引很小,查起来很快
但只限于查明确值
C.频繁在where子句中出现的列 我们要关注是否建立索引
D.大表的外键列,需要建立索引,因为主键值的DML操作会间接的去外键中验证是否在外键列引用
外键列此时没索引, 就要全表扫描, 所以一个主键只有几条记录,外键无索引一个DML可能会几个小时
二、什么时候不创建索引
1.这个列虽然索引效果很好,但是你业务中很少去使用这个列去查询的,考虑不要建索引,以均衡索引的成本.
2.如果该列上返回的结果集大于总结果集的2-4%(看总的数据量和CBO算法来定这只是参考值),谨慎考虑建立索引.
3.表很小时。因为很小表的时候全表访问比索引访问成本还低,有没有索引影响不大 业务初期的时候不创建索引 ,后期有一定的数据量的时候从创建
4.频繁更新的表,其频繁甚至超过查询,慎重考虑建立索引
5.这个索引列使用了函数表达式 需要创建函数索引
SQL> select instance_name ,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
ora10g OPEN
SQL> select * from v$version
索引多并不意味着性能好,索引对查询有利 对DML是有负担的.
A.一个字段包含一个较大范围的值,也就是说重复率比较小,就是所谓的高基数列
在一个大范围内去找小范围或精确的单个或几个值时 ,
索引非常有效,高基数列适合作索引 ,低基数列不适合作索引
B.一个列包含大量的NULL值
索引是不存NULL值的,那也就意味着这个索引很小,查起来很快
但只限于查明确值
C.频繁在where子句中出现的列 我们要关注是否建立索引
D.大表的外键列,需要建立索引,因为主键值的DML操作会间接的去外键中验证是否在外键列引用
外键列此时没索引, 就要全表扫描, 所以一个主键只有几条记录,外键无索引一个DML可能会几个小时
二、什么时候不创建索引
1.这个列虽然索引效果很好,但是你业务中很少去使用这个列去查询的,考虑不要建索引,以均衡索引的成本.
2.如果该列上返回的结果集大于总结果集的2-4%(看总的数据量和CBO算法来定这只是参考值),谨慎考虑建立索引.
3.表很小时。因为很小表的时候全表访问比索引访问成本还低,有没有索引影响不大 业务初期的时候不创建索引 ,后期有一定的数据量的时候从创建
4.频繁更新的表,其频繁甚至超过查询,慎重考虑建立索引
5.这个索引列使用了函数表达式 需要创建函数索引
SQL> select instance_name ,status from v$instance;
INSTANCE_NAME STATUS
---------------- ------------
ora10g OPEN
SQL> select * from v$version