随着系统数据的增多,一些查询逐渐变慢,这时候我们可以根据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的索引创建相关推荐

  1. php 查询 select 索引,MSSQL_详解sqlserver查询表索引,SELECT   索引名称=a.namen - phpStudy...

    详解sqlserver查询表索引 SELECT   索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid FROM sysindexes a JOI ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 上篇的地址:SQLSERVER聚集索引与非聚集索引的再 ...

  3. 关于Mongodb索引创建的一些体会

    2019独角兽企业重金招聘Python工程师标准>>> mongodb索引分类以及创建我就不多说了,如果想了解可以直接在百度上搜索,这里我说一下关于索引创建的个人想法. 1.优先给一 ...

  4. Oracle中加速索引创建或重建的方法

    Oracle中加速索引创建或重建的方法 View more documents from Maclean Liu

  5. mysql 创建job_MySQL 索引创建

    MySQL 索引创建 简介:在本教程中,您将了解索引以及如何使用MySQL CREATE INDEX语句向表中添加索引. 电话簿比喻 假设您有一本电话簿,其中包含城市中所有人的姓名和电话号码.假设你想 ...

  6. oracle查看创建索引语句,ORACLE下如何获得全部的索引创建语句

    ORACLE下如何获得全部的索引创建语句 ORACLE下如何获得全部的索引创建语句 今天打算将一个数据库的索引在另一个测试库上重新创建一遍,研究了一下. set pagesize 0 set long ...

  7. oracle 五种索引创建

    http://database.51cto.com/art/201010/231388.htm 要在Oracle数据库中使用索引,首先需要创建Oracle索引.下面就为您介绍创建Oracle索引的方法 ...

  8. 索引创建以及优化_1

    怎么去创建索引啊,我们先看第一种啊1. 普通索引,所谓的普通索引是什么啊,就是index,比如像这种primary key,还有index,还有unique,这些都可以把它划分到普通索引当中,他除了有 ...

  9. oracle 建分区索引_Oracle分区表及分区索引-创建list分区

    Oracle 分区表及分区索引 - 创建 list 分区 创建 list 分区的语法如上,需要我们指定的 : l column: 分区依赖列 ( 注意:只能是一个 ); l partition: 分区 ...

最新文章

  1. VUE 事件获取当前组件的属性
  2. etcd 集群运维实践
  3. c语言程序设计dowhile,(C语言while、dowhile、for循环课程5.docx
  4. 【CentOS Linux 7】实验4【Shell编程】
  5. 5.创建表,使用alter进行表信息的增删改,Oracle回收站,集合运算
  6. net自带二进制序列化,XML序列化和ProtoBuf序列化的压缩对比
  7. silverlightLogo动画
  8. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
  9. ajax post 与get方法 data写法
  10. PostgreSQL体系结构和基本操作
  11. android活动中的变量,在不同的活动中保持变量值Android Studio
  12. seafile自建服务器,自建云盘系列——Seafile (支持分布式存储)
  13. JSK-373 加密【入门】
  14. 【Luogu1048】采药
  15. [转]mysql慢查询日志
  16. 随手一写,简单的四则运算练习
  17. 招聘数据采集+Hive数据分析+数据可视化
  18. 定位推送分享轻社交网络平台《足迹》——数据库设计
  19. 百度uedit禁止转义及关于模板语言 Mustache
  20. 白盒测试及其基本方法

热门文章

  1. linux httpd 域名映射,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  2. yii2.0框架中自定义接口,实现类的多继承
  3. git show查看本地文件的修改部分,git diff 如何比较文件,git grep 搜索
  4. docker客户端连接远程服务器
  5. 【迁移学习(Transfer L)全面指南】CVPR(2020)元学习、小样本、领域自适应、领域泛化和迁移学习概述
  6. 【深度学习】U型的Transfomer网络(Swin-Unet)和Swin-Transformer分类
  7. 【Swing编写图形用户界面】操作系统之磁盘调度算法图形界面和性能比较
  8. Tensorflow【实战Google深度学习框架】—Logistic regression逻辑回归模型实例讲解
  9. 仅使用python基本语法、即不使用任何模块、编写_微博可以设置“仅半年内可见”!你竟然还不知道???...
  10. 网络营销期间选用冷门关键词网络营销效果会好吗?