一.InnoDB索引

InnoDB支持以下几种索引:

B+树索引

全文索引

哈希索引

本文将着重介绍B+树索引。其他两个全文索引和哈希索引只是做简单介绍一笔带过。

哈希索引是自适应的,也就是说这个不能人为干预在一张表生成哈希索引,InnoDB会根据这张表的使用情况来自动生成。

全文索引是将存在数据库的整本书的任意内容信息查找出来的技术,InnoDB从1.2.x版本支持。每张表只能有一个全文检索的索引。

B+树索引是传统意义上的索引,B+树索引并不能根据键值找到具体的行数据,B+树索引只能找到行数据锁在的页,然后通过把页读到内存,再在内存中查找到行数据。B+树索引也是最常用的最为频繁使用的索引。

二.什么是B+树

概念

B+树是一种平衡查找树,其实先想想看为什么要用平衡查找树,不用二叉树?普通的二叉树可能因为插入的数据最后变成一个很长的链表,怎么能提高搜索的速度呢?你可以想想,为什么HashMap和ConcurrentHashMap在JDK8的时候,当链表大于8的时候把链表转成红黑树(红黑树也是平衡查找树)。技术思维是想通的,那么答案无非是加快速度,性能咯。

一个B+树有以下特征:

有n个子树的中间节点包含n个元素,每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

所有叶子节点包含元素的信息以及指向记录的指针,且叶子节点按关键字自小到大顺序链接。

所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

那么我们先来看一个B+树的图

所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序的链表。为什么要有序呢?其实是为了范围查询。比如说select * from Table where id > 1 and id < 100; 当找到1后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。是不是范围查询的话hash就搞不定这个事情了?以下为B+树的优势:

单一节点存储更多元素,减少IO

所有查询都要找到叶子节点,查询稳定

所有叶子节点形成有序链表,方便范围查询

一般性情况,数据库的B+树的高度一般在2~4层,这就是说找到某一键值的行记录最多需要2到4次逻辑IO,相当于0.02到0.04s。

三.聚集索引和辅助索引

聚集索引

聚集索引是按表的主键构造的B+树,叶子节点存放的为整张表的行记录数据,每张表只能有一个聚集索引。优化器更倾向采用聚集索引。因为直接就能获取行数据。

请选择自增id来做主键,不要非空UK列。避免大量分页碎片。下面来看一个聚集索引的图:

那么很简单了,每个叶子节点,都存有完整的行记录。对于主键的查找速度那是相当的快,美滋滋。

辅助索引

辅助索引也叫非聚集索引,叶子节点除了键值以外还包含了一个bookmark,用来告诉InnoDB在哪里可以找到对应的行数据,InnoDB的辅助索引的bookmark就是相对应行数据的聚集索引键。也就是先获取指向主键索引的主键,然后通过主键索引来找到一个完整的行。如果辅助索引的树和聚集索引的树的高度都是3,如果不是走主键索引走辅助索引的话,那么需要6次逻辑IO访问得到最终的数据页。辅助索引和聚集索引的概念关系图如下:

四.索引实战

设计索引

设计索引的时候,无论是组合索引还是普通索引等。一般经验是,选择经常被用来过滤记录的字段,高选择性,高区分性。别把性别字段设计索引,性别属于低选择性的。你可以选择名字嘛,你好我大名叫苗嘉杏:)

知道加索引快,但是也别乱加索引,插入以及更新索引的操作InnoDB都会维护B+树的,多加很多索引只会导致效率降低!

不要用重复的索引,比如有个联合索引是a,b,你又整个a列的普通索引。那不是搞事么?

不要在索引上用函数和like

一颗聚集索引B+树可以放多少行数据?

这里我们先假设B+树高为2,即存在一个根节点和若干个叶子节点,那么这棵B+树的存放总记录数为:根节点指针数*单个叶子节点记录行数。假设一行记录的数据大小为1k,那么单个叶子节点(页)中的记录数=16K/1K=16。

那么现在我们需要计算出非叶子节点能存放多少指针,我们假设主键ID为bigint类型,长度为8字节,而指针大小在InnoDB源码中设置为6字节,这样一共14字节,我们一个页中能存放多少这样的单元,其实就代表有多少指针,即16kb/14b=1170。那么可以算出一棵高度为2的B+树,大概能存放1170*16=18720条这样的数据记录。

根据同样的原理我们可以算出一个高度为3的B+树大概可以存放:1170*1170*16=21902400行数据。所以在InnoDB中B+树高度一般为1-3层,它就能满足千万级的数据存储。在查找数据时一次页的查找代表一次IO,所以通过主键索引查询通常只需要1-3次逻辑IO操作即可查找到数据。

Cardinality值

如何判断一个索引建立的是否好呢?可以用show index from指令查看Cardinality值,这个值是一个预估值,而不是一个准确值。每次对Cardinality值的统计都是随机取8个叶子节点得到的。

对于innodb来说,达到以下2点就会重新计算cardinality

如果表中1/16的数据发生变化

如果stat_modified_counter>200 000 0000

实际应用中,(Cardinality/行数)应该尽量接近1。如果非常小则要考虑是否需要此索引。实战一下,比如有一张表,我们来show index一下

mysql> show index from Order;

+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |

+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

| Order | 0 | PRIMARY | 1 | id | A | 99552 | NULL | NULL | | BTREE | | |

| Order | 1 | IDX_orderId | 1 | orderId | A | 96697 | NULL | NULL | | BTREE | | |

| Order | 1 | IDX_productId | 1 | productId | A | 52 | NULL | NULL | | BTREE | | |

+---------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

3 rows in set (0.00 sec)

那么可以看到IDX_productId这个索引的Cardinality比较低。

需要强制刷新Cardinality值的话可以用:

analyze local table xxx;

参考:

《MySQL技术内幕》

《小灰漫画》

搞懂MySQL InnoDB事务ACID实现原理

前言 说到数据库事务,想到的就是要么都做修改,要么都不做.或者是ACID的概念.其实事务的本质就是锁和并发和重做日志的结合体.那么,这一篇主要讲一下InnoDB中的事务到底是如何实现ACID的. 原子 ...

一文快速搞懂MySQL InnoDB事务ACID实现原理(转)

这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔 ...

SQL优化 MySQL版 - B树索引详讲

SQL优化 MySQL版  - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...

MySQL&&num;160&semi;InnoDB表和索引之聚簇索引与第二索引

MySQL InnoDB表和索引之聚簇索引与第二索引 By:授客QQ:1033553122 每个InnoDB表都有一个称之为聚簇索引(clustered index)的特殊索引,存储记录行数据.通常, ...

一本彻底搞懂MySQL索引优化EXPLAIN百科全书

1.MySQL逻辑架构 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

程序员必须了解的知识点——你搞懂mysql索引机制了吗?

一.索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效 获取数据的数据结构,而MYSQL使用的数据结构是:B+树 在这里推荐大家看一本书,

MySQL的B树索引与索引优化

MySQL的MyISAM.InnoDB引擎默认均使用B+树索引(查询时都显示为"BTREE"),本文讨论两个问题: 为什么MySQL等主流数据库选择B+树的索引结构? 如何基于索引 ...

MySQL之B&plus;树索引&lpar;转自掘金小册 MySQL是怎样运行的,版权归作者所有!&rpar;

每个索引都对应一棵B+树,B+树分为好多层,最下边一层是叶子节点,其余的是内节点.所有用户记录都存储在B+树的叶子节点,所有目录项记录都存储在内节点. InnoDB存储引擎会自动为主键(如果没有它会自 ...

MySQL中B&plus;树索引的使用

1)         不同应用中B+树索引的使用 对于OLTP应用,由于数据量获取可能是其中一小部分,建立B+树索引是有异议时的 对OLAP应用,情况比较复杂,因为索引的添加应该是宏观的而不是微观的. ...

随机推荐

Minimum configuration for openldap to proxy multiple AD into a single search base

[root@localhost ~]# cd /etc/openldap[root@localhost openldap]# cat slapd.confloglevel 0x900include / ...

解决eclipse-helios中Errors running builder JavaScript Validator的问题&lpar;转&rpar;

mysql 什么树_搞懂MySQL InnoDB B+树索引相关推荐

  1. mysql 分区_搞懂MySQL分区

    一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念,它的所有数据都被逻辑地存放在表空间,表空间又由段,区,页组成. 段 段就是上图的segment区域,常见的段有数据段. ...

  2. 一文搞懂 MySQL 索引

    一文搞懂 MySQL 索引 1.MySQL 索引 简介 1.1.MySQL 索引 是什么?  索引是一个单独的.存储在 磁盘 上的 数据库结构 ,包含着对数据表里 所有记录的 引用指针. 1.2. M ...

  3. 学习最新大厂付费视频时整理的万字长文+配图带你搞懂 MySQL

    万字长文+配图带你搞懂 MySQL MySQL SQL的介绍 SQL分类 MySQL语法 创建数据库 修改.删除.使用数据库 DDL查询数据表 DDL创建数据表 修改数据表结构 删除数据表 DML添加 ...

  4. 图文结合带你搞懂MySQL日志之Error Log(错误日志)

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 作者:KAiTO 文章来源:社区原创 往期回顾: 图 ...

  5. 丁奇mysql45讲百度云下载_MySQL实战45讲,丁奇带你搞懂MySQL【完结】

    开篇词.这一次,让我们一起来搞懂MySQL.mp3 开篇词.这一次,让我们一起来搞懂MySQL.pdf 01.基础架构:一条SQL查询语句是如何执行的?.mp3 01.基础架构:一条SQL查询语句是如 ...

  6. 一文搞懂MySQL数据库分库分表

    如果数据量过大,大家一般会分库分表.分库需要注意的内容比较少,但分表需要注意的内容就多了. 工作这几年没遇过数据量特别大的业务,那些过亿的数据,因为索引设置合理,单表性能没有影响,所以实战中一直没用过 ...

  7. mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型

    速成指南 5分钟搞懂MySQL数据类型 之数值型--DECIMAL类型 DECIMAL类型的语法:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL].其中M指定的是数字的总位 ...

  8. 一文搞懂MySQL XA如何实现分布式事务

    一文搞懂MySQL XA如何实现分布式事务 前言 XA 协议 如何通过MySQL XA实现分布式事务 前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如 ...

  9. db2 删除索引_程序员必须了解的知识点——你搞懂mysql索引机制了吗?

    一.索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效 获取数据的数据结构,而MYSQL使用的数据结构是: B+树 在这里推荐大家看一本书, <深入理解计算机系统 ...

最新文章

  1. php配置控制器和视图位置,视图控制器
  2. 8W+文本数据,全景式展现中国教育发展情况
  3. sql将一列拆分为多列_SQL的弱点(2):不支持从所有列中去除某列
  4. 查找Windows文件来历的好方法
  5. 豆瓣9分以上,这7本Java经典名著,你还缺哪本?
  6. 【poj2114】点分治(离线)
  7. Ubuntu 源码方式安装Subversion
  8. Ubuntu18.04下QSqlDatabase: QMYSQL driver not loaded
  9. 27. Minimize casting
  10. oracle 检查链接数,oracle连接数检查
  11. 算法——Java实现栈
  12. php微信推送的模板信息内容都是空,微信模板消息 推送成功 但是内容显示空白...
  13. 苹果设置播放html5视频,类似苹果官网,使用滚轴事件控制视频播放
  14. python简单成绩录入,python实现简单成绩录入系统
  15. Android SDK安装及配置模拟器
  16. python画正方形的代码_python画正方形的代码是什么?
  17. TeamViewer 连接后无法操作的解决方法
  18. 远程计算机用户端口号,如何修改远程桌面端口号(手把手教你修改桌面端口号)...
  19. Office Visio软件在工控原理图中的应用
  20. 《Linux命令》常用命令-查询、替换、粘贴、复制、剪切、目录、删除、用户等操作。

热门文章

  1. 巾粉世家消毒毛巾能对美发店脏毛巾进行统一回收
  2. ubuntu 解决第三方库安装遇到的问题
  3. 下排牙齿中间高两边低_楼房两边高中间低的好吗
  4. 西门子数控免授权数据采集CNC采集实战二
  5. 树莓派用网线连接笔记本获取IP,使用putty登录
  6. 《HTML5 2D游戏编程核心技术》——第1章,第1.8节练习
  7. 【mysql】union的使用
  8. 万物数字化的时代,开发者的“变”与“不变”
  9. 【一步一步的积累】OverFeat
  10. The Squared Mosquito Coil dfs