声明:虽然题目是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)

概念可见

Selectivity介绍

这个原理强调成本
        
          比如:
        
          ① 选择性强的字段放在前面、可以减少 Index Range Scan 的扫描成本
          ② 有个税务系统、原先的复合索引是(月份,税务机关代号,纳税人识别号,发票代号,收费类别)
               对于这个索引、优化器并没有选择走索引、而是全表扫、原因如下:
               ● 同一月份的记录太多了、超过1/3、全表扫成本低
               ● 字段顺序没有考虑可选性
               新的复合索引是(纳税人识别号,月份,收费类别,税务机关代号,发票代号)
           
           
     ㈢ 复合索引好处
        
          ① 尽可能让一个索引为更多的SQL服务
          ② 复合索引是排序的、ORDER BY涉及索引字段时、可减少排序成本
        
        
     我认为呢、在为复合索引字段排序时、应该综合考虑权衡前缀性和可选性、绝不可偏袒任何一方

本文转自:http://blog.csdn.net/dba_waterbin/article/details/8954690

最新文章

  1. UICollectionView
  2. flex 弹性布局
  3. .NET Core 在Visual Studio 2015 下的使用-MSDN
  4. Android基础总结(6)——内容提供器
  5. 代码片段------find批量处理
  6. 【Android 界面效果45】ViewPager源码分析
  7. 【47】请使用traits classes表现类型信息
  8. JavaBean与EJB的区别与应用
  9. IList, ICollection ,IEnumerable AND IEnumerator in C#
  10. perl uri_escape(urlencode ) 转换
  11. Yii2 基于RESTful api 坑 访问会把控制器名称变为复数
  12. http response
  13. OpenWRT 恢复出厂设置命令
  14. Servlet之Response对象
  15. VS Code汉化
  16. ios 审核未通过 相机相册权限问题
  17. 用Django ORM实现树状结构
  18. bootstrap-datepicker default value
  19. lvm入门
  20. dubbo学习过程、使用经验分享及实现原理简单介绍

热门文章

  1. Codeforces 920 E Connected Components?
  2. 基于Bootstrap的对话框插件bootstrap-dialog
  3. SQL表操作习题4 14~25题 缺20题
  4. Netbeans 中部署运行Webservice出错
  5. Memcache的mutex设计模式 -- 高并发解决方案
  6. KVM Network Bridging
  7. sourceinsight tab 空格 对齐 等宽字体
  8. THINKPHP nginx设置路由为PATHINFO模式
  9. 浏览器的DNS缓存查看和清除
  10. C# 下利用ICSharpCode.SharpZipLib.dll实现文件/目录压缩、解压缩