【sql server】索引详解
索引可以理解为一种特殊的目录结构。
sql server提供两种索引形式: 聚集索引和非聚集索引。
怎么理解这两种形式。
拿我们常用的字典举例来说, 一个字典好比数据库中的一个表。那么当我们想从字典中查某个汉字比如“璐”的时候, 我们会从目录里面翻到L开头的部分, 在这一部分中去查找“璐”这个字。 这种方式就属于通过聚集索引查询数据。
那么当你对一个汉字不认识或者不知道叫什么时候, 比如“钰”, 那么就得通过这个汉字的偏旁部首“钅”通过部首目录在部首目录中找到这个字, 然后根据这个字对应的实际页码, 去字典中查到这个字。但是“钰”这个字在部首目录的上下数据可能对应的页码, 一个在天南,一个在海北。 这种方式的查询就属于非聚集索引查询。
上面的栗子只是辅助我们对索引查询的作用有一个大致的概念。然而我们在实际对数据库进行操作的时候, 实际上要有充分的经验才能判断出如何使用索引, 使我们的查询速度得到显著地改善。
对于同一个表, 只允许有一个聚集索引。 因为这就好比字典的目录, 只能通过一种顺序进行排序。所以聚集索引显得很珍贵, 在实际工作和项目中, 遇到什么样case使用什么样的索引, 可以参考下面表:
动作描述 |
使用聚集索引 |
使用非聚集索引 |
列经常被分组排序 |
应 |
应 |
返回某范围内的数据 |
应 |
不应 |
一个或极少不同值 |
不应 |
不应 |
小数目的不同值 |
应 |
不应 |
大数目的不同值 |
不应 |
应 |
频繁更新的列 |
不应 |
应 |
外键列 |
应 |
应 |
主键列 |
应 |
应 |
频繁修改索引列 |
不应 |
应 |
下面我们会通过实际情况,对照表中的情况进行索引设计练习。
1. “主键 就是聚集索引。”
虽然SQL server默认就是对主键添加的聚集索引。但是我认为这是对资源的一种浪费。
项目中设计表结构的时候, 通常会为表添加一个ID列。以方便于区分每条数据。这种ID列很多都是自增长的,并且步长为1。此时如果将这个列设置为主键, SQL server就会将这个列设置聚集索引。 这样做的好处就是可以让数据在数据库中按照ID进行物理排序,但是这么做的意义其实不会很大。
我们之所以要对表设计一个聚集索引, 目的就是为了在查询这个表的时候能够迅速缩小查询范围, 而不必对全表进行扫描。而在实际的应用当中, 我们的id一般是自动生成的,所以很难在实践中用ID号去查询。这就让ID这个主键作为聚焦索引成为一个浪费。
如果可以根据项目的需求, 比如项目是一个办公自动化系统, 系统首页需要显示的数据比如用户的文件, 会议。这种情况下对数据进行查询都离不开字段是“日期”以及“用户名”, 通常,办公自动化的首页会显示每个用户尚未签收的文件或会议。虽然我们的where语句可以仅仅限制当前用户尚未签收的情况,但如果系统已建立了很长时间,并且数据量很大,那么,每次每个用户打开首页的时候都进行一次全表扫描,这样做意义是不大的,绝大多数的用户1个月前的文件都已经浏览过了,这样做只能徒增数据库的开销而已。事实上,我们完全可以让用户打开系统首页时,数据库仅仅查询这个用户近3个月来未阅览的文件,通过“日期”这个字段来限制表扫描,提高查询速度。如果办公自动化系统已经建立的2年,那么首页显示速度理论上将是原来速度8倍,甚至更快。
下面是我在测试环境中测试的case
从建表的语句中,我们可以看到这个有着1000万数据的表中fariqi字段有5003个不同记录。在此字段上建立聚合索引是再合适不过了。在现实中,我们每天都会发几个文件,这几个文件的发文日期就相同,这完全符合建立聚集索引要求的:“既不能绝大多数都相同,又不能只有极少数相同”的规则。由此看来,我们建立“适当”的聚合索引对于我们提高查询速度是非常重要的。
2. “只要建立索引就能显著提高查询速度。”这个说法也不对
应该是在合适的字段上加上合适的索引。
3. “把所有需要提高查询速度的字段都加进聚集索引,以提高查询速度”
上面提到进行数据查询时候都离不开的字段是:“日期”和“用户名”。 既然这两个字段都很重要, 我们可以合并这两个字段建立一个“复合索引(Compound index)”
待续。
【sql server】索引详解的更多相关文章
- Sql server 索引详解
参考资料:老K写的,http://www.cnblogs.com/AK2012/archive/2013/01/04/2844283.html SQL索引在数据库优化中占有一个非常大的比例, 一个好的 ...
- SQL SERVER分区详解(1-5)
转自: (五)SQL Server分区自动化案例 (四)SQL Server分区管理 (三)索引分区知识详解 (二)SQL Server分区创建过程 (一)SQL Se ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- (一)SQL Server分区详解Partition(目录)
一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水 ...
- SQL Server知识详解
1.SET NOCOUNT ON的作用: 作用:阻止在结果集中返回显示受T-SQL语句或则usp影响的行计数信息. 语法:SET NOCOUNT {ON | OFF} 详解:当SET ONCOUNT ...
- SQL SERVER 数据类型详解(SQL Server 2008)
数据类型类别 SQL Server 中的数据类型归纳为下列类别: 数字类型 1.精确数字 2.近似数字 3.日期和时间 字符串类型 4.非Unicode字符串 4.Unicode字符串 5.二进制字符 ...
- SQL Server 锁详解
锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制.也就是说,如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作.你能否执行操作取决于其他用户正在进行的操作. 通过 ...
- SQL Server事务详解
事务定义: 事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除. 事务三种运行模式: ...
- SQL Server 数据类型详解
引言 SQL Server是我们日常工作中经常用到的数据库,也是商业系统运用最广泛的数据库之一.如何构建合理.高效.节省空间的数据库?是非常考验程序的基本功底,因为数据库是程序的根基,直接影响着系统效 ...
- sql server 函数详解(5)系统函数
返回表中指定字段的长度 返回表中指定字段的名称 返回数据表达式的数据的实际长度函数 返回数据库的编号 返回数据库的名称 返回数据库当前默认的null值 返回服务器端计算机的标识号 返回服务 ...
随机推荐
- codeforces 979B Treasure Hunt
题意: 给出三个字符串,每个字符串长度相同,给出n,要求在n轮内,每一个字符串必须改变一个字符. 问最后哪个字符串中拥有最多相同的字符,即美丽度最大. 思路: 首先,很不容易想到的一点是从a变到a,有 ...
- linux 远程执行命令
命令: ssh 命令参数: -l 指定登入用户 -p 设置端口号 -f 后台运行,并推荐加上 -n 参数 -n 将标准输入重定向到 /dev/null,防止读取标准输入 -N 不执行远程命令,只做端口 ...
- redis相关问题
什么是Redis?Redis 是一个使用 C 语言写成的,开源的 key-value 数据库..和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...
- Jmeter分布式压力测试
有时候,一台机器无法支持很多个虚拟用户并发,这时就会使用分布式测试来实现这个功能,jmeter是有提供这个功能的.要实现分布式测试,得在主从(agent和controler)机器的jmeter安装目录 ...
- 以太坊智能合约介绍,Solidity介绍
以太坊智能合约介绍,Solidity介绍 一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. Storage contract SimpleSt ...
- js中的children实时获取子元素
先看下面一个小例子的结果 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Codeforce 834A - The Useless Toy
Walking through the streets of Marshmallow City, Slastyona have spotted some merchants selling a kin ...
- brctl 命令详解
安装网桥管理工具包:bridge-utile ```# yum install bridge-utils -y``` ```使用brctl命令创建网桥br1```# brctl addbr br1`` ...
- SpringMVC实现 MultipartFile 文件上传
1. Maven 工程引入所需要的依赖包 2. 页面需要开放多媒体标签 3. 配置文件上传试图解析器 4. 接收图片信息,通过 IO 流写入磁盘(调用解析其中的方法即可) 如下: 1.1 引入所依赖的 ...
- Python小项目四:实现简单的web服务器
https://blog.csdn.net/u010103202/article/details/74002538 本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www ...