这两天有个非常强烈的感觉就是自己在一些特别的情况下还是hold不住,脑子easy放空或者说一下子不知道怎么去分析问题了,比方,问“hash和btree索引的差别”,这非常难吗。仅仅要掌握了这两种数据结构稍加分析就能得出答案,结果是一下子不知道从何说起。进入正题吧。这两者有啥差别。

1. hash索引查找数据基本上能一次定位数据。当然有大量碰撞的话性能也会下降。

而btree索引就得在节点上挨着查找了,非常明显在数据精确查找方面hash索引的效率是要高于btree的。

2. 那么不精确查找呢,也非常明显,由于hash算法是基于等值计算的。所以对于“like”等范围查找hash索引无效,不支持;

3. 对于btree支持的联合索引的最优前缀。hash也是无法支持的。联合索引中的字段要么全用要么全不用。提起最优前缀竟然都泛起迷糊了,看来有时候放空得太厉害。

4. hash不支持索引排序。索引值和计算出来的hash值大小并不一定一致。

勤动脑,少放空。

索引是在数据库表或者视图上创建的对象,目的是为了加快对表或视图的查询的速度。

依照存储方式分为:聚集与非聚集索引

依照维护与管理索引角度分为:唯一索引、复合索引和系统自己主动创建的索引。

索引的结构是由:根节点--->非叶节点--->非叶节点--->叶节点

1、聚集索引:表中存储的数据依照索引的顺序存储,检索效率比普通索引高,但对数据新增/改动/删除的影响比較大。

逻辑顺序决定了表中对应行的物理顺序

特点:

  (1) 一个表能够最多能够创建249个索引

  (2) 先建聚集索引才干创建非聚集索引

     (3) 非聚集索引数据与索引不同序

     (4) 数据与索引在不同位置

     (5) 索引在叶节点上存储,在叶节点上有一个"指针"直接指向要查询的数据区域

     (6) 数据不会依据索引键的顺序又一次排列数据

(7)假设在该字段上进行范围查询,或者该表非常少做增删改



 创建聚集索引的语法:

   create NONCLUSTERED INDEX idximpID ON EMP(empID)

2、非聚集索引:不影响表中的数据存储顺序,检索效率比聚集索引低,对数据新增/改动/删除的影响非常少

是通过二叉树的数据结构来描写叙述的,逻辑顺序,特点:

   (1) 无索引。数据无序

   (2) 有索引。数据与索引同序 

   (3) 数据会依据索引键的顺序又一次排列数据

   (4) 一个表仅仅能有一个索引

   (5) 叶节点的指针指向的数据也在同一位置存储

语法:

create CLUSTERED INDEX idxempID on emp(empID)

3、惟一索引:惟一索引能够确保索引列不包括反复的值.

能够用多个列,可是索引能够确保索引列中每一个值组合都是唯一的

姓   名

李   二

张   三

王   五

语法: create unique index idxempid on emp(姓,名)



4、复合索引:假设在两上以上的列上创建一个索引,则称为复合索引。

那么。不可能有两行的姓和名是反复的

语法:

create index indxfullname on addressbook(firstname,lastname)

注意:假设把复合的聚集索引字段分开查询。

带着这个问题。我们来看一下下面的查询速度(结果集都是25万条数据):(日期列fariqi首先排在复合聚集索引的起始列。usernameneibuyonghu排在后列):

    (1)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5''

    查询速度:2513毫秒

    (2)select gid,fariqi,neibuyonghu,title from Tgongwen where fariqi>''2004-5-5'' and neibuyonghu=''办公室''

    查询速度:2516毫秒

    (3)select gid,fariqi,neibuyonghu,title from Tgongwen where neibuyonghu=''办公室''

    查询速度:60280毫秒

  从以上试验中,我们能够看到假设仅用聚集索引的起始列作为查询条件和同一时候用到复合聚集索引的所有列的查询速度是差点儿一样的。甚至比用上所有的复合索引列还要略快(在查询结果集数目一样的情况下);而假设仅用复合聚集索引的非起始列作为查询条件的话,这个索引是不起不论什么作用的。当然,语句1、2的查询速度一样是由于查询的条目数一样。假设复合索引的所有列都用上,并且查询结果少的话,这样就会形成“索引覆盖”。因而性能能够达到最优。同一时候,请记住:不管您是否常常使用聚合索引的其它列,但其前导列一定要是使用最频繁的列。



5、系统自建的索引:在使用T_sql语句创建表的时候使用PRIMARY KEY或UNIQUE约束时。会在表上自己主动创建一个惟一索引

自己主动创建的索引是无法删除的

语法:

create table ABc

( empID int primary key,

   firstname varchar(50)UNIQUE,

   lastname   varchar(50)UNIQUE,

)

这种结果就出来了三个索引,但仅仅有一个聚集索引哦





6、创建索引的方法:

1、企业管理器中

(1)右击某个表,全部任务---管理索引,打开管理索引。单击“新建”就能够创建索引

(2)在设计表中进行设计表,管理索引/键

(3)在关系图中,加入表后右击关系图中的某个表,就有“索引/键”

(4)通过向导,数据库---创建索引向导

(5)通过T-SQL语句

2、能过“索引优化向导”来优化索引的向导。通过它能够决定选择哪些列做为索引列

 

 二、何时使用聚集索引或非聚集索引

以下的表总结了何时使用聚集索引或非聚集索引(非常重要):

动作描写叙述 使用聚集索引 使用非聚集索引
列常常被分组排序
返回某范围内的数据 不应
一个或极少不同值 不应 不应
小数目的不同值 不应
大数目的不同值 不应
频繁更新的列 不应
外键列
主键列
频繁改动索引列 不应

关于mysql建立索引 复合索引 索引类型的更多相关文章

  1. 《MySQL面试小抄》索引考点二面总结

    <MySQL面试小抄>索引考点二面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...

  2. mysql建立索引类型及索引建立的原则

    索引类型:Unique(唯一索引,一般为主键),Normal(一般索引,普通字段,可做组合索引),索引方法:BTREE 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录 ...

  3. mysql建立、删除索引及使用

    同步发布:http://www.yuanrengu.com/index.php/2017-01-13.html 一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少 ...

  4. mysql索引之四:复合索引之最左前缀原理,索引选择性,索引优化策略之前缀索引

    高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可 ...

  5. ( 转 ) mysql复合索引、普通索引总结

    对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合 ...

  6. MySQL建立索引的注意事项

    对于大数据量的表格,尤其是百万行以上的数据表,一定要对其建立索引,否则查询速度极慢.(参考后面的测试结果)建立索引时需注意: MySQL的索引有两种:单列索引(即在某一列上建索引).多列组合索引(即在 ...

  7. MySQL数据库索引的4大类型以及相关的索引创建

    以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...

  8. MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引

    什么是索引? 索引用于快速找出某个列中有一特定值的行,不使用索引,mysql必须从第1条记录开始读完整的表,直到找出相关的行.表越大,查询数据所花费的实际越多.如果表中查询的列有一个索引,mysql能 ...

  9. mysql建立索引的几大原则

    (转)仅供自己学习,特此记录 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录.例如,学生表中学号是具有唯一性的字段.为该字段建立唯一性索引可以很快的确定某个学生的信息 ...

随机推荐

  1. idea关闭,tomcat却没关闭的设置方法

    最近,遇到个事,我在打开tomcat时,关闭了idea,再次打开时,运行tomcat时,发现端口占用,查看任务管理器,发现,tomcat没有随idea的关闭而关闭. 后来,想想,可能是,在关闭时,点了 ...

  2. php 日常问题

    1.isset.empty.is_null的区别 isset 判断变量是否定义或者是否为空 变量存在返回ture,否则返回false 变量定义不赋值返回false unset一个变量,返回false ...

  3. ubuntu环境安装docker

    查看已安装的docker apt list docker* 如果已安装,并且需要卸载,则执行以下命令: apt remove docker* 更新apt索引 apt update apt需要支持HTT ...

  4. PID28 [Stupid]愚蠢的宠物

    题链:https://www.rqnoj.cn/problem/28 题目描述 背景 大家都知道,sheep有两只可爱的宠物(一只叫神牛,一只叫神菜).有一天,sheep带着两只宠物到狗狗家时,这两只 ...

  5. angular2集成highchart

    集成highchart的配置困扰了我很久,今天终于解决了: 1.修改tsconfig.app.json: "compilerOptions": { //... "type ...

  6. 【Codeforces 1086B】Minimum Diameter Tree

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 统计叶子节点个数m 把每条和叶子节点相邻的边权设置成s/cnt就可以了 这样答案就是2*s/m(直径最后肯定是从一个叶子节点开始,到另外一个叶 ...

  7. C语言不容易识别的坑

    1.重复两次定义 #include<stdio.h> #include<stdlib.h> #include<string.h> int a,b; void fun ...

  8. [luoguP2827] 蚯蚓(堆?队列!)

    传送门 35分做法 用堆来取最大值,暴力更新其余数的值. 65~85分做法 还是用堆来取最大值,其余的数增加可以变成新切开的两个数减少,最后统一加上一个数. #include <queue> ...

  9. Linux下汇编语言学习笔记27 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  10. hdu - 1104 Remainder (bfs + 数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=1104 注意这里定义的取模运算和计算机的%是不一样的,这里的取模只会得到非负数. 而%可以得到正数和负数. 所以需 ...