sqlserver的索引创建
随着系统数据的增多,一些查询逐渐变慢,这时候我们可以根据sqlserver的执行计划,查看sql的开销,然后根据开销创建索引。
索引有聚集索引与非聚集索引。
聚集索引:聚集索引在存储上是按照顺序存储的,就像字典里的汉字。
非聚集索引:物理存储不连续,但逻辑上是连续的,因为单独维护着数据的存储位置与数据的关系。
首先写入100000数据
DECLARE @i INT, @num int SET @i=0 SET @num=100000 WHILE @i<=@num BEGIN IF NOT EXISTS(SELECT * FROM dbo.meter_manage WHERE meter_id=@i) INSERT INTO dbo.meter_manage ( meter_id , meter_no , meter_name ) VALUES ( @i , -- meter_id - int 'asdasd'+CONVERT(VARCHAR(20),@i), -- meter_no - varchar(500) 'asdsf'++CONVERT(VARCHAR(20),@i) -- meter_name - varchar(500) ); SET @i=@i+1; END go
非聚集索引的创建:
create NONCLUSTERED INDEX index1 ON meter_manage(meter_no)
效果:
select * from meter_manage where meter_no='asdasd2'
创建非聚集索引之前,耗时23毫秒左右
创建非聚集索引之后,瞬间完成
经常使用多条件语句查询时,我们可创建复合索引。
select * from meter_manage where meter_no='asdasd2' and meter_name='asdsf2'
未创建非聚集索引,耗时30毫秒:
在meter_no字段创建单索引,耗时3毫秒:
create NONCLUSTERED INDEX index1 ON meter_manage(meter_no)
条件查询位置更换:
select * from meter_manage where meter_name='asdsf2' and meter_no='asdasd2'
查询速度没变,同样3毫秒。
我们同时在另一个字段meter_name上也建立一个非聚集索引:
create NONCLUSTERED INDEX index2 ON meter_manage(meter_name)
发现两个非聚集索引的时间与一个聚集索引的时间没有太大变化,查看执行计划,只命中了index1索引:
分析:
我们来想象一下当数据库有N个索引并且查询中分别都要用上他们的情况:
查询优化器(用大白话说就是生成执行计划的那个东西)需要进行N次主二叉树查找[这里主二叉树的意思是最外层的索引节点],此处的查找流程大概如下:
查出第一条column1主二叉树等于1的值,然后去第二条column2主二叉树查出foo的值并且当前行的coumn1必须等于1,最后去column主二叉树查找bar的值并且column1必须等于1和column2必须等于foo。
如果这样的流程被查询优化器执行一遍,就算不死也半条命了,查询优化器可等不及把以上计划都执行一遍,贪婪算法(最近邻居算法)可不允许这种情况的发生,所以当遇到以下语句的时候,数据库只要用到第一个筛选列的索引(column1),就会直接去进行表扫描了。
select count(1) from table1 where column1 = 1 and column2 = 'foo' and column3 = 'bar'
所以与其说是数据库只支持一条查询语句只使用一个索引,倒不如说N条独立索引同时在一条语句使用的消耗比只使用一个索引还要慢。
所以如上条的情况,最佳推荐是使用index(column1,column2,column3) 这种联合索引,此联合索引可以把b+tree结构的优势发挥得淋漓尽致:
一条主二叉树(column=1),查询到column=1节点后基于当前节点进行二级二叉树column2=foo的查询,在二级二叉树查询到column2=foo后,去三级二叉树column3=bar查找。
结论:两个单独索引通常数据库只能使用其中一个
创建复合索引:
create index idx1 on meter_manage(meter_no,meter_name)
瞬间完成,发现多条件下适合创建复合索引。
条件位置改变一下
select * from meter_manage where meter_name='asdsf2' and meter_no='asdasd2'
同样瞬间完成。查看执行计划命中了idx1
我们去掉二个条件:
select * from meter_manage where meter_no='asdasd2'
同样瞬间完成,也命中了索引 idx1
我们去掉第一个条件:
select * from meter_manage where meter_name='asdsf2'
耗时27毫秒,与不加索引没什么区别,查看执行计划,发现虽然命中了idx1
但是类型却是Index Scan,与之前的Index Seek不同
区别:
[Table Scan] 表扫描(最慢),对表记录逐行进行检查
[Clustered Index Scan] 聚集索引扫描(较慢),按聚集索引对记录逐行进行检查
[Index Scan] 索引扫描(普通),根据索引滤出部分数据在进行逐行检查
[Index Seek] 索引查找(较快),根据索引定位记录所在位置再取出记录
[Clustered Index Seek] 聚集索引查找(最快),直接根据聚集索引获取记录
因此,字段上同时存在聚集索引与非聚集索引,这种情况下只会命中聚集索引,因为聚集索引最快,例如:主键上创建非聚集索引
create NONCLUSTERED INDEX index3 ON meter_manage(meter_id)
瞬间完成,执行计划:
转载于:https://www.cnblogs.com/chenyishi/p/9146097.html
sqlserver的索引创建相关推荐
- php 查询 select 索引,MSSQL_详解sqlserver查询表索引,SELECT 索引名称=a.namen - phpStudy...
详解sqlserver查询表索引 SELECT 索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid FROM sysindexes a JOI ...
- SQLSERVER聚集索引与非聚集索引的再次研究(下)
上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 上篇的地址:SQLSERVER聚集索引与非聚集索引的再 ...
- 关于Mongodb索引创建的一些体会
2019独角兽企业重金招聘Python工程师标准>>> mongodb索引分类以及创建我就不多说了,如果想了解可以直接在百度上搜索,这里我说一下关于索引创建的个人想法. 1.优先给一 ...
- Oracle中加速索引创建或重建的方法
Oracle中加速索引创建或重建的方法 View more documents from Maclean Liu
- mysql 创建job_MySQL 索引创建
MySQL 索引创建 简介:在本教程中,您将了解索引以及如何使用MySQL CREATE INDEX语句向表中添加索引. 电话簿比喻 假设您有一本电话簿,其中包含城市中所有人的姓名和电话号码.假设你想 ...
- oracle查看创建索引语句,ORACLE下如何获得全部的索引创建语句
ORACLE下如何获得全部的索引创建语句 ORACLE下如何获得全部的索引创建语句 今天打算将一个数据库的索引在另一个测试库上重新创建一遍,研究了一下. set pagesize 0 set long ...
- oracle 五种索引创建
http://database.51cto.com/art/201010/231388.htm 要在Oracle数据库中使用索引,首先需要创建Oracle索引.下面就为您介绍创建Oracle索引的方法 ...
- 索引创建以及优化_1
怎么去创建索引啊,我们先看第一种啊1. 普通索引,所谓的普通索引是什么啊,就是index,比如像这种primary key,还有index,还有unique,这些都可以把它划分到普通索引当中,他除了有 ...
- oracle 建分区索引_Oracle分区表及分区索引-创建list分区
Oracle 分区表及分区索引 - 创建 list 分区 创建 list 分区的语法如上,需要我们指定的 : l column: 分区依赖列 ( 注意:只能是一个 ); l partition: 分区 ...
最新文章
- VUE 事件获取当前组件的属性
- etcd 集群运维实践
- c语言程序设计dowhile,(C语言while、dowhile、for循环课程5.docx
- 【CentOS Linux 7】实验4【Shell编程】
- 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
- net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比
- silverlightLogo动画
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- ajax post 与get方法 data写法
- PostgreSQL体系结构和基本操作
- android活动中的变量,在不同的活动中保持变量值Android Studio
- seafile自建服务器,自建云盘系列——Seafile (支持分布式存储)
- JSK-373 加密【入门】
- 【Luogu1048】采药
- [转]mysql慢查询日志
- 随手一写,简单的四则运算练习
- 招聘数据采集+Hive数据分析+数据可视化
- 定位推送分享轻社交网络平台《足迹》——数据库设计
- 百度uedit禁止转义及关于模板语言 Mustache
- 白盒测试及其基本方法
热门文章
- linux httpd 域名映射,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- yii2.0框架中自定义接口,实现类的多继承
- git show查看本地文件的修改部分,git diff 如何比较文件,git grep 搜索
- docker客户端连接远程服务器
- 【迁移学习(Transfer L)全面指南】CVPR(2020)元学习、小样本、领域自适应、领域泛化和迁移学习概述
- 【深度学习】U型的Transfomer网络(Swin-Unet)和Swin-Transformer分类
- 【Swing编写图形用户界面】操作系统之磁盘调度算法图形界面和性能比较
- Tensorflow【实战Google深度学习框架】—Logistic regression逻辑回归模型实例讲解
- 仅使用python基本语法、即不使用任何模块、编写_微博可以设置“仅半年内可见”!你竟然还不知道???...
- 网络营销期间选用冷门关键词网络营销效果会好吗?