这两天有个非常强烈的感觉就是自己在一些特别的情况下还是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. CAD参数绘制mcdbsolid对象(com接口)

    C#中实现代码说明: private void DrawSolid() { //绘McDbSolid对象 axMxDrawX1.AddLinetype("MLineType1", ...

  2. Vue打包之后部署到 express 服务器上

    Part.1 安装 express npm install express body-parer --save Part.2 在项目根目录下创建 app.js 文件作为启动 express 服务器代码 ...

  3. Android网站

    http://blog.csdn.net/airsaid/article/details/52902299 android调用传感器的代码 http://blog.csdn.net/huangbiao ...

  4. 一篇文章告你python能做什么,该不该学?好不好学?适不适合学?

    一.python好学吗?简单吗?容易学吗?没有编程的领取能学吗? 最近有很多小伙伴都在问我这些问题.在这里,我想说,python非常简单易学. 1,简单, Python 非常易于读写,开发者可以把更多 ...

  5. python 列表生成式、lower()和upper()的使用

    参考: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868196389 ...

  6. jquery.form.min.js

    /*! * jQuery Form Plugin * version: 3.51.0-2014.06.20 * Requires jQuery v1.5 or later * Copyright (c ...

  7. ''tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[?]'' 错误分析

    这是tensorflow 一个经常性错误,错误的原因在于:显卡内存不够. 解决方法就是降低显卡的使用内存,途径有以下几种措施: 1 减少Batch 的大小 2 分析错误的位置,在哪一层出现显卡不够,比 ...

  8. 21反射、动态代理、枚举、Filter

    2018/10/08 1.反射 Constructor Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Cla ...

  9. 全国绿色计算大赛 模拟赛第一阶段(Python)

    第1关求和 class Task: def getSum(self, num1, num2): sum = 0 for i in range(num1, num2 + 1): while (i != ...

  10. python多线程和多进程(二)

    ---恢复内容开始--- 一.多进程 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. impor ...