Mysql索引主要包括四种,Btree索引、Hash索引、full-text全文索引、R-tree索引,因为作为一名PHP开发者,并不是专业的DBA,在这里只需要了解第一种开发相关的BTree索引。

索引的本质:MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据和排序的数据结构。

数据库查询是数据库的主要功能之一,最基本的查询算法是顺序查找(linear search)时间复杂度为O(n),显然在数据量很大时效率很低。优化的查找算法如二分查找(binary search)、二叉树查找(binary tree search)等,虽然查找效率提高了。但是各自对检索的数据都有要求:二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织)。所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构。这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构就是索引。

如上图左边是横列表格,也就是真是的数据,右边是一棵树。数据越来越多,表格增长的越来越高,相反,如果树越来越高,查找的层次越来越多,我们如果能用三次找到,尽量别用四次,尽量减少一次磁盘I/O,也就是这棵树广度越来越广,广度广了同一层就代表枝叶多。

在数据库里面,在物理存储上,有单位的说法叫段、区、块,就是一种衡量单位。 上图中的磁块也就是相当于存储一段范围的数据。

看上图中,一棵B+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3。

我如果要找29这个数字,那么从根找,P1表示小与17的,P2表示大于17小与35的,P3表示大于35的,那么往下走,真实的数据存在于叶子节点,也就是第三层,即3、5、9、10、13...依次往右看。假设我要查找非叶子节点(第二层),不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不存在真实的数据表中,也就是相当于一个参考值。如果查找29,但是我们先给参考项,那么根据图示,29在17和35之间,锁定磁盘块1的P2指针,找到指针P2,内存时间非常短,相比磁盘的IO可以忽略不计,那么下来之后,找到磁盘块3,也就是不见得加载磁盘块2,这里就第二次IO了,那么看图,29在26和30之间,那么又指向指针P2,再往下就加载到了磁盘块8的内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总共三次IO。

看Btree也就是三层楼那么高,也就是尽量把数据横向扩,高度矮比较好,真实的情况是,3层的B+树 可以表示上百万的数据,如果上百万的数据查找只需三次IO,性能提高将是巨大的,如果没有所用,每个数据项都要发生一次IO,那么总共需要上百万次的IO,显然成本非常高。

Mysql索引结构与索引原理的更多相关文章

  1. SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL

          SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...

  2. mysql 查询表结构 查询索引

    首先进入到mysql里 show databases; 选择数据库 use xxxcms; 查询数据库下的表结构 show create table 表名; 这样看着不太好可以后面加\G show c ...

  3. MyISAM 和 InnoDB 索引结构及其实现原理

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据. 索引的实现通常使用B_TREE. B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; ...

  4. mysql系列十、mysql索引结构的实现B+树/B-树原理

    一.MySQL索引原理 1.索引背景 生活中随处可见索引的例子,如火车站的车次表.图书的目录等.它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的 ...

  5. 数据库为什么要用B+树结构--MySQL索引结构的实现(转)

    B+树在数据库中的应用 { 为什么使用B+树?言简意赅,就是因为: 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上 2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/ ...

  6. mysql索引分类及实现原理

    索引分类:主键索引.唯一索引.普通索引.全文索引.组合索引 1.主键索引:即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值 ALTER TABLE 'table_n ...

  7. B-/B+树 MySQL索引结构

    索引 索引的简介 简单来说,索引是一种数据结构 其目的在于提高查询效率 可以简单理解为“排好序的快速查找结构” 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在中磁 ...

  8. 为什么MySQL字符串不加引号索引失效?《死磕MySQL系列 十一》

    群里一个小伙伴在问为什么MySQL字符串不加单引号会导致索引失效,这个问题估计很多人都知道答案.没错,是因为MySQL内部进行了隐式转换. 本期文章就聊聊什么是隐式转换,为什么会发生隐式转换. 系列文 ...

  9. 搞懂MySQL(各种)索引类型及其区别

    索引的概念介绍: 1.聚集索引 聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引  也就是说聚集索引的顺序就是数据的物理存储顺序.它会根据聚集索引键的顺序来存储表中的数据,即对表的数据按索 ...

随机推荐

  1. Java中实现多态的机制(实质)?

    靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象.

  2. setTimeOut一些注意的地方

    for (var i = 0; i < data.length; i++) { var flashID = data[i].ID; //setTimeOut(removeFlashDiv(fla ...

  3. 上传文件提示IO Error

    百度查到的解决办法 http://www.wang0214.com/news/466.html 作者:深圳网站建设 原因: Asp.net中,上传文件的默认大小是4096 KB,也就是4M,不过你可以 ...

  4. CRUX下实现进程隐藏(1)

    想必能找到这里的都是被吴一民的操作系统大作业坑过的学弟学妹了,当初我也是千辛万苦才把这个作业完成了,本着服务后辈的宗旨,尽量让学弟学妹少走弯路,我会把实现的大概思路记录下来.本系列一共三篇文章,分别实 ...

  5. salt-stack更换主机名

    author:headsen  chen date: 2018-09-30  11:22:40 1,建立master端和client端的正常连接 #master yum -y install epel ...

  6. GOOGLE和百度的长域名

    GOOGLE的变态域名:www.mamashuojiusuannizhucedeyumingzaichanggoogledounengsousuochulai.cn/中文拼音:“妈妈说就算你注册的域名 ...

  7. SElinux以及防火墙的关闭

    [root@localhost targeted]# pwd/etc/selinux/targeted[root@localhost targeted]# getsebool -a|grep samb ...

  8. vscode 中使用 csscomb

    我看中 csscomb 主要是用来给 css 属性排序用的,当然他也有格式化的作用: 1.安装不必说,但是装了之后,默认似乎没用: 2.点开 文件-首选项,搜下 csscomb 就知道了: 3.第一个 ...

  9. 170614、MySQL存储引擎-MyISAM与InnoDB区别

    MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理 ...

  10. Sublime Text 2/3 安装Emmet(Zencoding)以及常见使用,一种快速编写HTML/CSS代码的方法

    原文链接http://blog.csdn.net/shirley254/article/details/52336744