深入理解Oracle索引(14):Composite Index 两大原理解析
来源:互联网 发布:手机淘宝分类链接获取 编辑:程序博客网 时间:2024/05/16 16:44
声明:虽然题目是Oracle、但同样适合MySQL InnoDB索引
在大多数情况下、复合索引比单字段索引好
很多系统就是靠新建一些合适的复合索引、使效率大幅度提高
复合索引比单字段索引复杂、有两个原则需把握:前缀性和可选性
但是、可叹的是、国内很多IT系统开发人员没有意识到应该优先设计复合索引
更没有充分理解复合索引的前缀性和可选性这两个重要原则
㈠ 前缀性(Prefixing)
在谓词条件中、只有将复合索引的第一个字段作为约束条件、该复合索引才会被用上
当然、存在一种例外:Index Skip Scan
这个原理强调使用
比如:
① 假如c1的选择性比c2高很多、且如果有大量如下查询:
select * from t where c1= :x and c2= :y;
select * from t where c2= :y;
这个时候(c2,c1)比(c1,c2)好
② 有ID和CREATE_TIME这两个字段、一个是主键、一个是创建时间
按一般情况、创建复合索引时、需要将ID放在前面、
不过、如果以CREATE_TIME为查询条件的SQL比较多、而ID的使用比较少
那么、我们在设计时、应该把CREATE_TIME前缀
在大多数情况下、复合索引比单字段索引好
很多系统就是靠新建一些合适的复合索引、使效率大幅度提高
复合索引比单字段索引复杂、有两个原则需把握:前缀性和可选性
但是、可叹的是、国内很多IT系统开发人员没有意识到应该优先设计复合索引
更没有充分理解复合索引的前缀性和可选性这两个重要原则
㈠ 前缀性(Prefixing)
在谓词条件中、只有将复合索引的第一个字段作为约束条件、该复合索引才会被用上
当然、存在一种例外:Index Skip Scan
这个原理强调使用
比如:
① 假如c1的选择性比c2高很多、且如果有大量如下查询:
select * from t where c1= :x and c2= :y;
select * from t where c2= :y;
这个时候(c2,c1)比(c1,c2)好
② 有ID和CREATE_TIME这两个字段、一个是主键、一个是创建时间
按一般情况、创建复合索引时、需要将ID放在前面、
不过、如果以CREATE_TIME为查询条件的SQL比较多、而ID的使用比较少
那么、我们在设计时、应该把CREATE_TIME前缀
㈡ 可选性(Selectivity)
概念可见
Selectivity介绍
这个原理强调成本
比如:
① 选择性强的字段放在前面、可以减少 Index Range Scan 的扫描成本
② 有个税务系统、原先的复合索引是(月份,税务机关代号,纳税人识别号,发票代号,收费类别)
对于这个索引、优化器并没有选择走索引、而是全表扫、原因如下:
● 同一月份的记录太多了、超过1/3、全表扫成本低
● 字段顺序没有考虑可选性
新的复合索引是(纳税人识别号,月份,收费类别,税务机关代号,发票代号)
㈢ 复合索引好处
① 尽可能让一个索引为更多的SQL服务
② 复合索引是排序的、ORDER BY涉及索引字段时、可减少排序成本
我认为呢、在为复合索引字段排序时、应该综合考虑权衡前缀性和可选性、绝不可偏袒任何一方
- 深入理解Oracle索引(14):Composite Index 两大原理解析
- 深入理解Oracle索引(2):INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCAN
- 深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN
- 深入理解Oracle索引(1):INDEX SKIP SCAN 和 INDEX RANGE SCAN
- 深入理解DB2索引(Index)
- 深入理解DB2索引(Index)
- 深入理解DB2索引(Index)
- 深入理解DB2索引(Index)
- 深入理解DB2索引(Index)
- 深入理解Composite模式
- Oracle composite index column ordering
- 深入理解Oracle索引(6):在实践中初步认识3大索引的使用场景
- 数据库二:深入理解DB2索引(Index)
- 索引index深入思考
- ORA-01502 oracle数据库 index索引的两种形式
- mongodb系列02-------深入理解索引原理
- 深入解析Windows系统两大进程
- [Index]组合索引(Composite Index)中多个字段的顺序
- 如何有效使用谷歌搜索引擎
- map 如何迭代
- 如何将sql 执行的错误消息 记录到本地文件中
- poj1523 求割点 及 该割点 可以 把该图分成几个连通分量
- 0002 Java语言基础组成1
- 深入理解Oracle索引(14):Composite Index 两大原理解析
- svn版本服务器搭建
- opencv打印二通道或三通道矩阵
- 黑马程序员_正则表达式
- 运维系统,发现报错,打开文件句柄数太多解决方案
- Android WIFI状态监控
- Position定位:relative | absolute
- ADO.NET数据库访问
- VC执行存储过程