复合索引最令人困惑的当属索引列的顺序,不仅依赖于使用该索引的查询,更需考虑排序和分组。
前段时候我发了个帖子:where条件顺序和复合索引字段顺序。感兴趣的朋友不妨参与讨论。
今天我提个自己的观点。

在应用开发阶段,【选择性】是我们首要考虑因素,请看简图:
当出现sql性能问题时,你可能需要注意以下几个:
1. 随机IO
2. 排序(order by)
3. 分组(group by or distinct)
这时不必也不应该在关注【选择性】
我的经验便是,在你手上已经有Top N SQL时,我们应该优先考虑【值的分布】,而不是选择性。

那么该如何判断【值的分布】,我们通过一种被geek称之为 【sarg】的方法,具体操作如下:
假如,我们有如下query:

[sql] view plaincopy print?
  1. select * from userresult_f where askid=800808 and uid=110996854;
select * from userresult_f where askid=800808 and uid=110996854;
则有2个索引可供选择:
1. idx_1 (askid,uid)
2. idx_2 (uid,askid)
是1 还是2 ?
利用【sarg】方法:

[sql] view plaincopy print?
  1. mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\G;
  2. *************************** 1. row ***************************
  3. sum(askid=800808): 6
  4. sum(uid=110996854): 2
  5. 1 row in set (0.00 sec)
mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\G;
*************************** 1. row ***************************
sum(askid=800808): 6
sum(uid=110996854): 2
1 row in set (0.00 sec)
依据查询输出,我们应该选择 idx_2
By 数据牧羊人
Good Luck!
2014-4-27 19:05  于福州

复合索引的列顺序判断相关推荐

  1. PostgreSQL 数据库多列复合索引的字段顺序选择原理

    标签 PostgreSQL , 多列索引 , 复合索引 , 驱动列 , 顺序 , 等值查询 , 范围扫描 , 离散值 , 连续值 , 单列索引 , bitmap index scan 背景 当需要创建 ...

  2. 复合索引 /多列索引 /联合索引 /组合索引?????

    复合索引 /多列索引 /联合索引 /组合索引,一个意思,不同叫法. 含有多个列字段的索引 联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2. 例如: 创建数据库表CREATE ...

  3. php复合索引,多列复合索引的使用绕过微软sqlserver的一个缺陷

    多列复合索引的使用绕过微软sqlserver的一个缺陷 作者:小涵 | 来源:互联网 | 2018-07-15 16:35 阅读: 4292 多列复合索引是指由多个字段组成的索引.这种情况相当常用的, ...

  4. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)...

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  5. SQL Server创建复合索引时,复合索引列顺序对查询的性能影响

    SQL Server创建复合索引时,复合索引列顺序对查询的性能影响 原文:SQL Server创建复合索引时,复合索引列顺序对查询的性能影响 说说复合索引 写索引的博客太多了,一直不想动手写,有一下两 ...

  6. MySQL复合索引探究

    复合索引(又称为联合索引),是在多个列上创建的索引.创建复合索引最重要的是列顺序的选择,这关系到索引能否使用上,或者影响多少个谓词条件能使用上索引.复合索引的使用遵循最左匹配原则,只有索引左边的列匹配 ...

  7. 复合索引使用的先决条件

    PS:懒得重新编辑图片了,直接把我从51上的日志拷过来了. 背景: 今天,接到一个项目的项目经理电话,告之说生产环境有几个查询超级慢,就是查询单张表的数据,查询条件也很简单,但是加了索引以后并没有走索 ...

  8. oracle中创建复合索引方法

    索引可以包含一个.两个或更多个列.两个或更多个列上的索引被称作复合索引.例如,以下语句创建一个具有两列的复合索引: CREATE INDEX name      ON employee (emp_ln ...

  9. mysql 复合索引 总结

    对于复合索引:MySQL从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合 ...

最新文章

  1. java变量代码_java 变量代码
  2. python爬取图片全网通_UC头条:全网通杀——暴强工具推荐: 下载你看到的任意视频...
  3. css揭秘笔记——用户体验
  4. Skype一国通套餐不再提供无限制拨打中国大陆地区通知
  5. xml获取配置DataTable
  6. hpml350服务器安装系统,安装HP ML350
  7. Move Zeroes
  8. PAT甲级1054 map的使用
  9. IBM推出全闪存产品 加速服务器I/O性能
  10. Window mobile 实现CLIST始终选中最新添加数据
  11. SkinSharp作者简述
  12. 网页扫雷(简易版)(一)
  13. 2022危险化学品生产单位安全生产管理人员考试题库及在线模拟考试
  14. Excel 使用技巧集锦—163种技巧
  15. java 进制转换类_Java基本数据类型以及进制转换
  16. opc服务器变量为空,OPC客户机上浏览不到OPC服务器上的变量
  17. UE4中3DUI防遮挡显示/穿模部分透明化显示
  18. Android粒子篇之Bitmap像素级操作
  19. 位地址和字节地址换算_IP地址详解
  20. 除了X站,程序员还喜欢上这些网站...

热门文章

  1. 等参元八节点matlab,四边形八节点等参元matlab程序
  2. 完整mes代码(含客户端和server端_Ice简介+Qt代码示例
  3. rancher添加私有仓库_CocoaPods搭建私有库
  4. asmx 接受 ajax post,jQuery ajax调用web服务(asmx)触发认证弹出框
  5. 【杂谈】有三AI秋季划火热进行中,如何深入学习模型优化,人脸算法,图像质量等研究方向...
  6. lazada开店入驻最新流程,开店只需三步
  7. VB 禁止修改系统时间
  8. 有米android sdk,有米积分墙Android SDK开发者常见问题
  9. 从玉农业谋定塞外-丰收节交易会·林裕豪:巴彦淖尔深圳签约
  10. app.vue添加子组件