有一个通常的误解,觉得应该把选择性高的字段放在最前面,这通常只是针对一个字段的索引,对于组合索引,常常要把做等式运算的字段放在最前面,看看测试

USE AdventureWorks
GOCREATE TABLE demo1
( id INT identity(1,1)  PRIMARY KEY,gender char(1) NOT NULL ,age int NOT NULL,DESCRIPTION varchar(1000) default(replicate('a',1000))
)--填充数字辅助表
--DROP TABLE  #numSELECT row_number() over( order BY customerid ) AS  number
INTO #num
FROM adventureworks.sales.Individual--插入测试数据
INSERT demo1 (gender,age)
SELECT CASE WHEN number%2=0 THEN 'f'ELSE 'm'END,abs(checksum(newid()))%80
FROM #num

创建如下的索引:

CREATE INDEX ix_age_sex ON demo1(age,gender) include(description) WITH (online=on)
 

查询如下的语句:

DBCC FREEPROCCACHE
CHECKPOINT
DBCC DROPCLEANBUFFERSSELECT age,gender,description FROM demo1
WHERE gender='f'
AND age BETWEEN 30 AND 40

逻辑读为:

(1236 row(s) affected)
Table 'demo1'. Scan count 1, logical reads 350, physical reads 3, read-ahead reads 346, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 

现在删除原来的索引,创建低选择性在前的索引

DROP INDEX ix_age_sex ON demo1
CREATE INDEX ix_age_sex ON demo1(gender,age)INCLUDE (description) WITH (online=on)

在来查询相同的语句:

DBCC FREEPROCCACHE
CHECKPOINT
DBCC DROPCLEANBUFFERSSELECT age,gender,description FROM demo1
WHERE gender='f'
AND age BETWEEN 30 AND 40

逻辑读为:

(1236 row(s) affected)
Table 'demo1'. Scan count 1, logical reads 181, physical reads 3, read-ahead reads 178, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

可以看到低选择性的字段放在前面逻辑读有350减少到了181,由此产生性能提升

总结:1:做等式运算的字段放在最前面,如果有多个等式运算,才要考虑等式运算字段的选择性

 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/fly_zj/archive/2012/08/11/2633629.html

添加组合索引时,做相等运算字段应该放在最前面相关推荐

  1. 数据库建立组合索引时应该遵循的规则, 精确查找先,范围查找后,尽管区分度高

    建组合索引的时候,区分度最高的在最左边. 正例:如果 where a=? and b=? ,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即 可. 说明:存在非等号和等号混合判断条件时,在 ...

  2. 创建组合索引时,索引列顺序的选择

    在创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建索引时列的顺序保持一致,否则组合索引会失效. 更进一步来说,组合索引的各个列中,到底谁应该在前,谁应该在后,还是说创建时 ...

  3. mysql为什么添加索引_当我添加新索引时,为什么MySQL中索引的基数保持不变?

    如果表中只有1行,则索引的基数当然应为1.它只是计算唯一值的数量. 如果您将索引视为基于存储桶的查找表(如散列),则基数是存储桶的数量. 以下是它的工作原理:当您在一组列(a,b,c,d)上构建索引时 ...

  4. mysql 添加唯一索引_浅谈Mysql索引

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...

  5. MySQL中的组合索引

    MySQL中的组合索引(复合索引) 使用多个字段创建索引,只用在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则): 一.最左前缀原则 最左优先: 例 使用表中的name,addr ...

  6. pylucene构建索引_java-Apache Lucene:建立索引时如何使用TokenSt...

    我正在寻找一种使用Apache Lucene编写自定义索引的方法(准确地说是PyLucene,但Java回答很好). 我要执行的操作如下:将文档添加到索引时,Lucene会将其标记化,删除停用词等.如 ...

  7. 普通索引 唯一索引 主键索引 组合索引 全文索引

    普通索引 这是最基本的索引,它没有任何限制.它有以下几种创建方式: (1)直接创建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表结 ...

  8. mysql 索引 767_MySQL innodb的组合索引各个列中的长度不能超过767,

    一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version; +-------------------------------+ ...

  9. MySQL组合索引(多列索引)使用与优化

    一.多列索引 我们经常听到一些人说"把WHERE条件里的列都加上索引",其实这个建议非常错误.在多个列上建立单独的索引大部分情况下并不能提高MySQL的查询性能.MySQL在5.0 ...

最新文章

  1. LNMP网站并发计算
  2. 什么是声明式事务控制
  3. 7搭建zabbix_监控03分布式监控Zabbix
  4. 再获绿色等级5A称号!揭开腾讯数据中心节能环保黑科技
  5. 开启防火墙web服务器访问权限 开启必要端口共外部使用
  6. STM32:GPIO四种输入输出模式。
  7. C++ 17 string_view(转载)
  8. 机械硬盘的文件系统突然变成RAW了,如何保住盘上数据?
  9. 电力电子技术笔记-逆变电路
  10. Python 根据图片url,批量下载图片
  11. 10个提升效率的编程好习惯
  12. java基本类型的小把戏
  13. Net Core对接支付宝SDK
  14. 谷歌浏览器翻译失效解决方案,百试百灵
  15. 微信小程序使用mock.js
  16. apollo planning module
  17. windows系统coursera视频播放出错解决方法
  18. 为什么win32k.sys在System进程空间无法访问
  19. 量化交易入门----双均线策略
  20. uni-app学习笔记4

热门文章

  1. [Redux/Mobx] Mobx和Redux有什么区别?
  2. 前端学习(3249):react的文件src
  3. [html] 使用button当按钮和使用div当按钮有什么区别?
  4. [vue] v-on可以绑定多个方法吗?
  5. [vue] vue给组件绑定自定义事件无效怎么解决?
  6. [css] 举例说明与打印有关的属性有哪些?
  7. 前端学习(2038)vue之电商管理系统电商系统之优化nprogress加载进度条
  8. plsql轻量版异常机制
  9. 前端学习(811):api和webapi
  10. 前端学习(548):node的自定义模块