oracle复合索引的选择和使用
声明:虽然题目是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前缀
㈡ 可选性(Selectivity)
概念可见
这个原理强调成本
比如:
① 选择性强的字段放在前面、可以减少 Index Range Scan 的扫描成本
② 有个税务系统、原先的复合索引是(月份,税务机关代号,纳税人识别号,发票代号,收费类别)
对于这个索引、优化器并没有选择走索引、而是全表扫、原因如下:
● 同一月份的记录太多了、超过1/3、全表扫成本低
● 字段顺序没有考虑可选性
新的复合索引是(纳税人识别号,月份,收费类别,税务机关代号,发票代号)
㈢ 复合索引好处
① 尽可能让一个索引为更多的SQL服务
② 复合索引是排序的、ORDER BY涉及索引字段时、可减少排序成本
我认为呢、在为复合索引字段排序时、应该综合考虑权衡前缀性和可选性、绝不可偏袒任何一方
本文转自:http://blog.csdn.net/dba_waterbin/article/details/8954690
最新文章
- UICollectionView
- flex 弹性布局
- .NET Core 在Visual Studio 2015 下的使用-MSDN
- Android基础总结(6)——内容提供器
- 代码片段------find批量处理
- 【Android 界面效果45】ViewPager源码分析
- 【47】请使用traits classes表现类型信息
- JavaBean与EJB的区别与应用
- IList, ICollection ,IEnumerable AND IEnumerator in C#
- perl uri_escape(urlencode ) 转换
- Yii2 基于RESTful api 坑 访问会把控制器名称变为复数
- http response
- OpenWRT 恢复出厂设置命令
- Servlet之Response对象
- VS Code汉化
- ios 审核未通过 相机相册权限问题
- 用Django ORM实现树状结构
- bootstrap-datepicker default value
- lvm入门
- dubbo学习过程、使用经验分享及实现原理简单介绍
热门文章
- Codeforces 920 E Connected Components?
- 基于Bootstrap的对话框插件bootstrap-dialog
- SQL表操作习题4 14~25题 缺20题
- Netbeans 中部署运行Webservice出错
- Memcache的mutex设计模式 -- 高并发解决方案
- KVM Network Bridging
- sourceinsight tab 空格 对齐 等宽字体
- THINKPHP nginx设置路由为PATHINFO模式
- 浏览器的DNS缓存查看和清除
- C# 下利用ICSharpCode.SharpZipLib.dll实现文件/目录压缩、解压缩