索引的目的在于提高查询效率,它的作用就相当于一本书的目录;

1. 常见的索引模型

1.1 哈希表

  优点:适用于等值查询的场景;

  缺点:范围查询效率较低;

1.2 有序数组

  优点:范围查询和等值查询效率较高;

  缺点:插入、删除操作效率较低;

  适用于静态存储引擎,保存一些不会修改的数据;

1.3 搜索树

  二叉树是一个经典的数据结构,增删改查效率都不错。不过由于索引需要存储在磁盘中,使用二叉树时,当节点数量很大时,树的高度会变的很高,一次查询可能访问很多数据块,由于磁盘IO问题,导致效率偏低;

  为了查询中尽量减少磁盘IO,必须访问尽量少的数据块,N叉树就是一个不错的选择;N叉树由于读写性能上的优点,以及适配磁盘的访问模式,已经广泛的用于搜索引擎。

  磁盘IO是非常高昂的操作,当进行一次磁盘IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page)。具体一页有多大数据跟操作系统有关,一般为4k或8k,也就是我们读取一页内的数据时候,实际上才发生了一次磁盘IO。

  设计数据库时,我们可以将N叉树的一个节点的大小设计为刚好一个操作系统的数据页大小,这样一次磁盘IO就可以将一个节点的数据全部读取到内存当中。

2. InnoDB索引模型

  在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。

  InnoDB中使用B+树索引模型,所以数据都是存储在B+树中的。

2.1 索引存储

  根据B+树叶子节点的内容,索引类型可分为主键索引和非主键索引。

  主键索引的叶子节点存储的是整行数据,主键索引也被称为聚簇索引;

  基于主键索引查询时,只需要搜索主键这棵B+树就可以查到这条记录的全部信息;

  非主键索引的叶子节点存储的是主键的值,在InnoDB中,非主键索引也被称为二级索引;

  基于非主键索引查询时,如果在这个非主键索引树上未查询到想要的信息,需要通过在非主键缩印树上查到的主键信息在主键索引树再查询一次,这个过程称为回表;

  主键索引的长度越小,普通索引的叶子节点就越小,其占用空间就越小;

3. 索引分类

3.1 单列索引

  select  id  from  table wherer k=1;

  普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,提高查询效率;

    对于普通索引,查询到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录(意味着全表扫描);

  唯一索引:索引列中的值必须是唯一的,但是允许为空值;

    对于唯一索引,由于索引定义的唯一性,查询到第一个满足条件的记录后,就停止继续检索;

  主键索引:一种特殊的唯一索引,不允许有空值;

3.2 复合索引(组合索引)

  复合索引:索引含有一个以上的字段组成,允许在定义索引的列中插入重复值和空值;

  复合唯一索引:索引含有一个以上的字段组成,由多个字段的值联合保证记录的唯一性;

  复合主键:主键含有一个以上的字段组成;

  复合索引在内部存储时也是一棵B+树,以复合索引的值为 key,以主键 ID 为 value;(可以方便使用覆盖索引)

  复合索引查询时需要遵循最左前缀原则:

  假如复合索引为:id,name,address;

  当查询时使用的索引是从第一个索引开始,且一次从左到右的顺序时,此时复合索引可以起作用,提高查询效率;

  比如:id 或者 id,name 或者 id,name,address三种情况之一复合索引就可以起作用,其他顺序复合索引都不会起作用;

3.3 覆盖索引

  假如有一个表,有一个主键索引为身份证号码,一个普通索引为年龄;

  select  card_id from  user  where  age between  10  and  20;

  在这个查询中,在 age 的索引树上已经有card_id 的值了,因此可以直接获得查询结果,不需要回表。在这个查询中,索引  age 已经覆盖了我们的查询需求,我们称之为覆盖索引;

3.3 索引失效的情况

  1. 在索引字段上使用 <,>,!=,in,not in, IS NULL 和 IS NOT NULL;

  2.  在 where 子句中使用 or 来连接条件,对字段进行表达式操作或者函数操作;

  3. 使用 like 模糊匹配时避免以%开头;

4. 页分裂

  当一个数据页已经满了,此时如果向该页中插入数据,则会申请一个新的数据页,然后挪动部分数据过去,该过程称之为页分裂;页分裂会使空间的使用率降低50%左右;

  当相邻两个页删除了数据,利用率很低时,会将数据页做合并,称为页合并;

MySQL:索引的更多相关文章

  1. 深入MySQL索引

    MySQL索引作为数据库优化的常用手段之一在项目优化中经常会被用到, 但是如何建立高效索引,有效的使用索引以及索引优化的背后到底是什么原理?这次我们深入数据库索引,从索引的数据结构开始说起. 索引原理 ...

  2. MySQL 索引

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是 ...

  3. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  4. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  5. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  7. MySQL索引类型总结和使用技巧以及注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...

  8. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

  9. mysql索引总结----mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  10. Mysql 索引实现原理. 聚集索引, 非聚集索引

    Mysql索引实现: B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的一个变种,My ...

随机推荐

  1. df命令详解

    1.简介: df命令作用是列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多少空间. df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当前 ...

  2. h5-audio/video标签

    音频/视频 基础用法 属性 事件 audio元素和video元素 <audio id="audio" src="./成都.mp3"></aud ...

  3. MFC笔记5

    1.MessageBox()             引用自(http://www.douban.com/note/40199603/) 一 函数原型及参数 function MessageBox(h ...

  4. HDU-1078.FatMouseandCheese(线性dp + dfs)

    本题大意:在一个n * n的迷宫内进行移动,左上角为初始位置,每次可以走的步数不能超过m,并且每次走的方格上面的数字要大于前一次走的放个数字,不能走到格子外面,问如何能使得到的数字和最大. 本题思路: ...

  5. 186. Reverse Words in a String II 翻转有空格的单词串 里面不变

    [抄题]: Given an input string , reverse the string word by word. Example: Input: ["t"," ...

  6. go语言 http学习

    net/http库学习 概念 处理器 处理器:拥有ServeHTTP方法的接口(任何类型) 签名:ServeHTTP(http.ResponseWriter, *http.Request) Respo ...

  7. adb、monkey常用命令

    adb.monkey常用命令 1.查看连接设备 adb devices 2.连接android模拟器 adb connect 127.0.0.1:62001 3.安装软件 adb install 这个 ...

  8. PHP常见的一些问题总结(收藏)

    本篇文章给大家带来的内容是关于PHP常见的一些问题总结(收藏),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1. 字符串定义的时候单引号和双引号有什么区别? 单引号加载速度比双引号 ...

  9. python 05集合

    1.集合 特性:可变的,不同元素组成,无序,集合中元素类型必须是不可变(数字,元组,字符串) 形式:s={1,"good",(2,3)} 方法:add(), clear()清空, ...

  10. RQNOJ 3 Jam的计数法

    一道模拟题,用的vector比用链表要方便很多,毕竟不需要自己写,因为是递增的,所以每一次你都要去检查最后一位加1之后有没有越界,如果没越界你就可以把他当前的字符删掉替换成他下一位的字符就可以了,如果 ...