一、索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

二、索引能干什么?

索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。

三、索引的分类?

1、从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。这里所描述的是索引存储时保存的形式,

2、从应用层次来分:普通索引,唯一索引,复合索引

3、根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。

平时讲的索引类型一般是指在应用层次的划分。

就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。

普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

唯一索引:索引列的值必须唯一,但允许有空值

复合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。

不谈存储引擎,只讨论实现(抽象)

4.1、Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。

4.2、B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。

4.3、B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。

结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

idnamebirthday

1

Tom

1996-01-01

2

Jann

1996-01-04

3

Ray

1996-01-08

4

Michael

1996-01-10

5

Jack

1996-01-13

6

Steven

1996-01-23

7

Lily

1996-01-25

在MyISAM引擎中的实现(二级索引也是这样实现的)

在InnoDB中的实现

五、为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树?

B-tree:因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;

Hash:虽然可以快速定位,但是没有顺序,IO复杂度高。

二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树:树的高度随着数据量增加而增加,IO代价高。欢迎关注公众号"Java学习之道",查看更多干货!

六、为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

6.1、插入连续的数据:

6.2、插入非连续的数据:

七、简单总结下

1、MySQL使用B+Tree作为索引数据结构。

2、B+Tree在新增数据时,会根据索引指定列的值对旧的B+Tree做调整。

3、从物理存储结构上说,B-Tree和B+Tree都以页(4K)来划分节点的大小,但是由于B+Tree中中间节点不存储数据,因此B+Tree能够在同样大小的节点中,存储更多的key,提高查找效率。

4、影响MySQL查找性能的主要还是磁盘IO次数,大部分是磁头移动到指定磁道的时间花费。

5、MyISAM存储引擎下索引和数据存储是分离的,InnoDB索引和数据存储在一起。

6、InnoDB存储引擎下索引的实现,(辅助索引)全部是依赖于主索引建立的(辅助索引中叶子结点存储的并不是数据的地址,还是主索引的值,因此,所有依赖于辅助索引的都是先根据辅助索引查到主索引,再根据主索引查数据的地址)。

7、由于InnoDB索引的特性,因此如果主索引不是自增的(id作主键),那么每次插入新的数据,都很可能对B+Tree的主索引进行重整,影响性能。因此,尽量以自增id作为InnoDB的主索引。

mysql索引默认是什么意思_MySQL索引的理解相关推荐

  1. mysql索引优化有几种_mysql索引优化

    索引类型 从物理存储角度上,索引可以分为聚集索引和非聚集索引. 1.聚集索引(Clustered Index) 聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引. 2.非聚集索引(Non- ...

  2. mysql索引详细介绍简书_MySql索引详解

    image 常见索引类型(实现层面) 索引种类(应用层面) 聚簇索引与非聚簇索引 覆盖索引 最佳索引使用策略 1.常见索引类型(实现层面) 首先不谈Mysql怎么实现索引的,先马后炮一下,如果让我们来 ...

  3. mysql索引是自动使用吗_mysql索引是自动使用吗?

    MYSQL在创建索引后对索引的使用方式分为两种:其一,由数据库的查询优化器自动判断是否使用索引:其二,用户可在写SQL语句时强制使用索引. MYSQL在创建索引后对索引的使用方式分为两种: 1 由数据 ...

  4. mysql索引久了需要重新_mysql索引更新要多久

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

  5. mysql listagg函数 长度过长_MySQL索引是什么?怎么做?

    首先,MySql 支持多种存储引擎,最为常用的是 innodb,MyIsam 也需要了解,其他的存储引擎包括 Archive 等等都要有个印象. 各种存储引擎对于索引的支持也不相同,总结下来,MySq ...

  6. 假设mysql数据表t1有字段_Mysql 索引及优化

    什么是索引 索引是什么?相信大家都用过字典.你是怎么从厚厚的新华字典中找到你需要找到的那个字的呢?又是怎么从一本书中快速定位到你需要的章节? 我们都是通过书中的目录,然后根据目录中的页码定位到我们要的 ...

  7. mysql索引名字可以重复吗_MySql索引

    索引简介 索引是一个单独的.物理的数据库结构,它是某个表中一列或若干列值的集合与相应的指向表中数据的指针组成清单.索引的作用相当于书的目录,可以根据目录中的页码快速定位到所需的内容.索引是一种使记录有 ...

  8. mysql索引详细介绍简书_Mysql索引介绍

    数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某 ...

  9. 建立索引和主外约束_Mysql索引原理

    阅读文本大概需要3分钟. 作者:菜菜聊架构来源:https://www.cnblogs.com/caicz/p/11009507.html 一.为什么要有索引 索引在MySQL中也叫做"键& ...

最新文章

  1. 定义AI,麦卡锡、图灵、乔丹...我们听谁的?
  2. 聊聊SwitchUserFilter的使用
  3. java 中文问号问题_解决java中的中文乱码问题(ZT)
  4. python 魔法参数*argv 和 **kw
  5. 在windows下查看进程
  6. vue+node实现中间层同步调用接口
  7. STM32 - 高级定时器的设定 - 基础-05 - 输出波形控制 -Complementary outputs and dead-time insertion 相位调整@互补输出和死区控制
  8. storyBoard方式ScrollView的AutoLayout
  9. 聚焦BCS|专家共议“内生安全框架”如何护航新基建
  10. Git客户端Mac版:SmartGit
  11. UIView常见方法
  12. 再谈“学微积,用手机”
  13. 无线通信原理之OFDM技术
  14. 渐渐热起来的网盘搜索工具
  15. unity mysql 中文乱码_unity3d链接postgresql,读数据库内容并且显示(读出的中文在编辑器中乱码,发布standalone正常)...
  16. IKEv2的密钥计算方式
  17. STM32+LCD实现简单的贪吃蛇小游戏
  18. 恢复iPhone已删除的短信
  19. 绑定机制(转自天运科技)
  20. 新建第一个HBuilder项目

热门文章

  1. 计算机工具栏图标素材,设计软件工具栏图标icon
  2. JAVA全栈开发微服务架构模式
  3. Rancher Labs获2000万美元B轮融资, CEO 梁胜出任有容云联席CTO
  4. 英语口语(英语流利说)笔记
  5. EMPS:个人做数据分析处理的4重境界
  6. 数据结构 深入理解二叉树的实现
  7. windows server搭建redcap数据库基本流程
  8. 【Windows】Windows下通过图形界面安装MySQL数据库
  9. 进程间通信之面包师问题
  10. 【题】【矩阵】NKOJ 1901 喜欢奇数的面包师