添加组合索引时,做相等运算字段应该放在最前面
有一个通常的误解,觉得应该把选择性高的字段放在最前面,这通常只是针对一个字段的索引,对于组合索引,常常要把做等式运算的字段放在最前面,看看测试
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
添加组合索引时,做相等运算字段应该放在最前面相关推荐
- 数据库建立组合索引时应该遵循的规则, 精确查找先,范围查找后,尽管区分度高
建组合索引的时候,区分度最高的在最左边. 正例:如果 where a=? and b=? ,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即 可. 说明:存在非等号和等号混合判断条件时,在 ...
- 创建组合索引时,索引列顺序的选择
在创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建索引时列的顺序保持一致,否则组合索引会失效. 更进一步来说,组合索引的各个列中,到底谁应该在前,谁应该在后,还是说创建时 ...
- mysql为什么添加索引_当我添加新索引时,为什么MySQL中索引的基数保持不变?
如果表中只有1行,则索引的基数当然应为1.它只是计算唯一值的数量. 如果您将索引视为基于存储桶的查找表(如散列),则基数是存储桶的数量. 以下是它的工作原理:当您在一组列(a,b,c,d)上构建索引时 ...
- mysql 添加唯一索引_浅谈Mysql索引
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...
- MySQL中的组合索引
MySQL中的组合索引(复合索引) 使用多个字段创建索引,只用在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则): 一.最左前缀原则 最左优先: 例 使用表中的name,addr ...
- pylucene构建索引_java-Apache Lucene:建立索引时如何使用TokenSt...
我正在寻找一种使用Apache Lucene编写自定义索引的方法(准确地说是PyLucene,但Java回答很好). 我要执行的操作如下:将文档添加到索引时,Lucene会将其标记化,删除停用词等.如 ...
- 普通索引 唯一索引 主键索引 组合索引 全文索引
普通索引 这是最基本的索引,它没有任何限制.它有以下几种创建方式: (1)直接创建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表结 ...
- mysql 索引 767_MySQL innodb的组合索引各个列中的长度不能超过767,
一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version; +-------------------------------+ ...
- MySQL组合索引(多列索引)使用与优化
一.多列索引 我们经常听到一些人说"把WHERE条件里的列都加上索引",其实这个建议非常错误.在多个列上建立单独的索引大部分情况下并不能提高MySQL的查询性能.MySQL在5.0 ...
最新文章
- LNMP网站并发计算
- 什么是声明式事务控制
- 7搭建zabbix_监控03分布式监控Zabbix
- 再获绿色等级5A称号!揭开腾讯数据中心节能环保黑科技
- 开启防火墙web服务器访问权限 开启必要端口共外部使用
- STM32:GPIO四种输入输出模式。
- C++ 17 string_view(转载)
- 机械硬盘的文件系统突然变成RAW了,如何保住盘上数据?
- 电力电子技术笔记-逆变电路
- Python 根据图片url,批量下载图片
- 10个提升效率的编程好习惯
- java基本类型的小把戏
- Net Core对接支付宝SDK
- 谷歌浏览器翻译失效解决方案,百试百灵
- 微信小程序使用mock.js
- apollo planning module
- windows系统coursera视频播放出错解决方法
- 为什么win32k.sys在System进程空间无法访问
- 量化交易入门----双均线策略
- uni-app学习笔记4
热门文章
- [Redux/Mobx] Mobx和Redux有什么区别?
- 前端学习(3249):react的文件src
- [html] 使用button当按钮和使用div当按钮有什么区别?
- [vue] v-on可以绑定多个方法吗?
- [vue] vue给组件绑定自定义事件无效怎么解决?
- [css] 举例说明与打印有关的属性有哪些?
- 前端学习(2038)vue之电商管理系统电商系统之优化nprogress加载进度条
- plsql轻量版异常机制
- 前端学习(811):api和webapi
- 前端学习(548):node的自定义模块