InnoDB是mysql处理OLTP(online transcation process)类型业务的存储引擎。为了加快数据查询速度。InnoDB引擎提供了丰富的索引实现。

1. 索引的分类

索引能够分为聚集索引和非聚集索引,聚簇索引(cluster) index)是指索引中键值的逻辑顺序和相应行的物理顺序一致。简单说就是索引中键值存储的是相应的行数据。非聚簇索引中索引的键值中存储的仅仅是相应行的引用。并不代表行实际的存储。

索引是在数据库的存储引擎中实现。不同的存储引擎索引的实现不一样。

举例来说。你翻到新华字典的汉字“爬”那一页就是P开头的部分。这就是物理存储顺序(聚簇索引)。而不用你到文件夹,找到汉字“爬”所在的页码,然后依据页码找到这个字(非聚簇索引)[1]。

依据实现方式的不同。索引分为B+树索引、哈希索引、全文索引和空间树索引。B/B+树是实现索引经常使用的数据结构。它是一个平衡的多叉查找树,从根节点到每个叶子节点的距离相等且树的高度可控,因此能够大幅度的降低查找次数。

哈希是一种非常快的查找方法,普通情况下查找的时间复杂度为O(1),可是非常多的数据库系统如SQL Server、Oracle并不支持哈希索引。MySQL的Memory存储引擎默认的存储类型为哈希。

而在InnoDB数据库引擎实现了一种自适应性哈希索引。InnoDB引擎会监控对索引表上索引的查找,假设观察到建立哈希索引能够带来速度的有效提升,则建立哈希索引。

自适应性索引通过缓冲池的B+树构建而来,因此建立速度非常快。全文索引是使用相似倒排索引的结构构造而成,MySQL中能够在建表时指定FULLTEXT到nchar,vchar,text类型性的字段上建立全文索引。


2. MyISAM和InnoDB索引实现的不同


聚簇索引保证keyword的值相近的元组存储的物理位置也同样(所以字符串类型不宜建立聚簇索引。特别是随机字符串。会使得系统进行大量的移动操作),且一个表仅仅能有一个聚簇索引。由于由存储引擎实现索引。所以。并非全部的引擎都支持聚簇索引。眼下,仅仅有solidDB和InnoDB支持。

叶子页面包括完整的元组,而内节点页面仅包括索引的列(索引的列为整型)。一些DBMS同意用户指定聚簇索引,可是MySQL的存储引擎到眼下为止都不支持。InnoDB对主键建立聚簇索引。假设你不指定主键,InnoDB会用一个具有唯一且非空值的索引来取代。假设不存在这种索引。InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。一般来说,DBMS都会以聚簇索引的形式来存储实际的数据。它是其他二级索引的基础。

MyISAM仅仅支持非聚簇的索引,因此在谈主键索引和辅助索引之间的差别的时候不能简单的一概而论,比較合适的说法应该是这种:

索引的功能是在存储引擎上存在的。不同的存储引擎实现主键索引和辅助索引不同。在MyISAM存储引擎中,主键索引和非逐渐索引都是非聚簇索引,叶子节点都是存储相应数据行的引用。而在InnoDB中,主键索引是聚集索引,B+树的叶子节点存储是行数据。辅助索引是非聚集索引。索引B+树叶子节点存储的相应行的主键。通过主键索引能够找到相应的行。

另外InnoDB支持自适应哈希索引,MyISAM支持全文索引。MySQL 5.6以后的InnoDB存储引擎也開始支持全文索引。

3. 使用索引的几个原则

索引能够降低查询的次数,可是一个错误的观点是在每个可能的属性上都建索引。索引的建立和调整过程会消耗资源。与索引相应的全表查找。假设表中数据的数量非常少建索引事实上是不合适的。那什么情况下使用索引才更有效呢?

B+树索引使用的两个原则:

1. 高选择性

2. 结果集的数量非常少的情况

假设某个字段取值范围非常广(性别和地域字段就是一个返利),差点儿没有反复,即高选择性,则此时使用B+树索引是最合适的。

假设结果的数量非常多通过B+树索引一层层推断的性能差于全表扫描。

即使你在该列加了索引,优化器也不会使用索引,而是会使用全表扫描的方法。

对于另外一种情况,优化器是怎么推断是不是应该使用索引的呢?优化器会通过EXPLAIN的row字段预估查询可能得到的行,假设大于20%的行优化器会使用全表扫描的方法。

实际上。预估的返回行数的值是不准确的。因此优化器有时是不靠谱的。

假设我们能够明白知道返回的结果集的大小,能够使用force index(index_col)强制使用索引。

3.1 索引失效的情况

B+树索引失效实质是查询不适用B+树查找的性质。

常见的情况有:

(1)后项或者中间匹配,比如:使用like ‘a%*’是能够使用索引。使用like ‘%*a’ 索引失效

(2)使用IS NOT NULL或者<>

(3)在索引列上使用函数或者运算

(4)复合索引中where条件没有使用到第一列,比如:where A=1或者where A=1 and B=2都会使用到索引,where B=2或者where A=1 or B=2索引失效.

<h1>4 主键索引和辅助索引</h1>
<h1>5 复合索引 </h1>

參考文章:

[1] http://blog.chinaunix.net/uid-116213-id-3395051.html

InnoDB引擎索引大观的更多相关文章

  1. mysql优化-------Myisam与innodb引擎,索引文件的区别

    Myisam与innodb引擎,索引文件的区别: innodb的次索引指向对主键的引用. myisam的次索引和主索引都指向物理行. myisam一行一行的插入,会产生一行一行的文件,磁盘上有数据文件 ...

  2. mysql InnoDB引擎索引超过长度限制

    组合索引长度之和大于 767 bytes并无影响,当有某个字段定义长度大于 767 bytes(1000*3)时,仅产生告警,但不影响创建,超长字段会取前 255 字符作为前缀索引,并且组合索引中字段 ...

  3. [转]MySQL InnoDB引擎索引长度受限怎么办

    mysql> CREATE TABLE `tb` (-> `a` varchar(255) DEFAULT NULL,-> `b` varchar(255) DEFAULT NULL ...

  4. 【MySQL】Mysql(InnoDB引擎) 索引的数据结构为什么选择B+Tree

    1.B+ Tree的层数较少 B类树的一个很鲜明的特点就是数的层数比较少,而每层的节点非常多,树的每个叶子节点到根节点的距离都是相同的: 2.   减少磁盘IO: 树的每一个节点都是一个数据也,这样每 ...

  5. Java面试05|MySQL及InnoDB引擎

    1.InnoDB引擎索引 InnoDB支持的索引有以下几种: (1)哈希索引 (2)全文索引 (1)B+树索引 又可以分为聚集索引与辅助索引 索引的创建可以在CREATE TABLE语句中进行,也可以 ...

  6. 一篇文章带你搞懂InnoDB的索引|结合样例

    关注公众号[程序员白泽],带你走进一个不一样的程序员/学生党 前言 前阵子面试的时候,在第三面问到了MySQL索引相关的知识点,并且给出了一些SQL语句分析索引的执行情况.所以今天这篇文章给大家讲讲索 ...

  7. InnoDB引擎的索引和存储结构

    在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的.而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据 ...

  8. MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  9. Mysql在InnoDB引擎下索引失效行级锁变表锁案例

    先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...

随机推荐

  1. 6.C语言文件操作之英语电子字典的实现,dos版

    多的不说,直接上代码: 里面涉及的字典文件在这:这是传送门,下载下来以后把该文件放在工程目录下即可 #define _CRT_SECURE_NO_WARNINGS #include <stdio ...

  2. java操作文件创建、删除

    java操作文件创建.删除: package test; import java.io.File; import java.io.IOException; import org.slf4j.Logge ...

  3. IE11 补丁 KB2929437[已过期]

    2014年4月 请更新此补丁 KB2929437 开发人员工具有重要更新 DOM 面板右侧新增 "更改"面板,用于记录调试时修改的 CSS Rules: JS 调试面板,新增 so ...

  4. OpenGL编程(一)渲染一个指定颜色的背景窗口

    上次已经搭好了OpenGL编程的环境.已经成功运行了第一个程序.可只是照搬书上的代码,并没弄懂其中的原理.这次通过一个小程序来解释使用GLUT库编写OpenGL程序的过程. 程序的入口 与其他程序一样 ...

  5. Python 批处理文本文件、进行查找

    去年换了一部手机,老手机终于光荣退休了,但是里面的便签里还存有很多文字记录,这个手机还不能备份到云,只能将每个便签保留为一个个的文本文件,我想要把所有的文本文件归到一个文本文件中,手动操作太麻烦了,刚 ...

  6. 【Educational Codeforces Round 37 C】 Swap Adjacent Elements

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然l..r这一段连续的1可以把l..r+1变成有序的. 那么就把所有的连续1段变成有序的就好. 看看最后是不是升序即可. [代码] ...

  7. Java基础学习总结(23)——GUI编程

    一.AWT介绍 所有的可以显示出来的图形元素都称为Component,Component代表了所有的可见的图形元素,Component里面有一种比较特殊的图形元素叫Container,Containe ...

  8. IPMI远程管理一点记录

    http://www.07net01.com/storage_networking/IPMIyuanchengguanliyidianjilu_53093_1357975254.html

  9. ArcGIS api for javascript——查找任务-在地图上查找要素

    描述 本例展示了如何使用查找任务搜索数据.本例在地图上用图表显示结果并用DojoX的grid格式化结果为表格样式. FindTask构造函数需要一个ArcGIS Server地图服务的URL.本例使用 ...

  10. python里面 __future__的作用 & 下划线的作用 & 3.0实现不换行

    参考这篇文章: http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820 ...