一、B+树索引概述

索引是应用程序设计和开发的一个重要方面。若索引太多,应用程序的性能可能会受到影响(需维护索引的结构和数据);而索引太少,对查询性能又会产生影响。

二叉树,左子树的键值总是小于根的键值,右子树的键值总是大于根的键值。

平衡二叉树(AVL树),任何节点的两个子树的高度最大差为 1。平衡二叉树的查询速度很快,但是维护一棵平衡二叉树的代价是非常大的。通常来说,需要 1 次或多次左旋和右旋来得到插入或更新后树的平衡性。

B+ 树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,B+ 树中的 B 不是代表二叉(binary),而是代表平衡(balance)。在 B+ 树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接,叶子节点之间组成一个双向链表。

B+ 树索引的本质就是 B+ 树在数据库中的实现,但是 B+ 索引在数据库中有一个特点是高扇出性(数据库分区),因此在数据库中,B+ 树的高度一般都在 2-4 层,这也就是说查找某一键值的行记录时最多只需要 2 到 4 次IO。

数据库中的 B+ 树索引可以分为 聚集索引和辅助索引。

B+ 树索引并不能找到一个给定键值的具体行。B+ 树索引能找到的只是被查找数据行所在的页。然后数据库通过把页读入到内存,再在内存中查找,最后得到要查找的数据。

二、索引创建和查看

索引的创建和删除可以通过两种方法,一种是 ALTER TABLE,另一种是 CREATE/DROP INDEX。用户可以设置对整个列的数据进行索引,也可以只索引一个列的开头部分数据。

## 添加索引alter table  add index (column_list);alter table  add unique(column_list);alter table  add primary key(column_list);## 删除索引alter table  drop index ;alter table  drop primary key;
## 添加索引create index  on (column_list);create unique index  on (column_list);## 删除索引drop index  on ;

索引的查看,可以使用命令 SHOW INDEX。

SHOW INDEX FROM 

Non_unique 表示是否非唯一的索引;Column_name 表示索引列的名称;Seq_in_index 表示索引中该列的位置;Collation 表示列以什么方式存储在索引中,可以是 A 或 NULL,B+ 树索引总是 A,即排序的;Sub_part 是否是列的部分被索引,如果是整个列,则该字段显示为 NULL;Packed 关键字如何被压缩;Null 是否索引中的列含有 NULL 值;Index_type 索引的类型。

Cardinality 非常关键的值,表示索引中唯一值的数目的估计值,优化器会根据这个值来判断是否使用这个索引。这个值并不是实时更新的,如果需要实时更新 Cardinality 的信息,可以使用 ANALYZE TABLE 命令。建议在非高峰时间,对应用程序下的几张核心表做 ANALYZE TABLE 操作,这能使优化器和索引更好的工作(除了 ANALYZE TABLE 外,还有 SHOW TABLE STATUS、SHOW INDEX 以及访问 INFORMATION SCHEMA 架构下的表 TABLES 和 STATISTICS 都会去重新计算 Cardinality 值)。

MySQL 对于主键索引的创建会采用临时表的方式,首先会创建一张带有主键索引的临时表,然后把原表中数据导入到临时表,接着删除原表,最好把临时表重命名为原表名,这部分操作会导致数据库不可用,因此建议在创建表的时候就定义好主键!

MySQL 对于辅助索引的创建支持 FIC —— Fast Index Creation(快速索引创建)方式,其会对创建索引的表加上一个 S 锁,不需要建立临时表。

MySQL 5.6 版本开始支持 Online DDL(在线数据定义)操作,其允许辅助索引创建的同时,还允许其他诸如 INSERT、UPDATE、DELETE 这类 DML 操作,其原理是将 DML 操作日志写入到一个缓存中,待完成索引创建后再将缓存应用到表上,以此达到数据的一致性,这个缓存的大小由参数 innodb_online_alter_log_max_size 控制,默认的大小为 128MB。

AlTER TABLE  [index_type](index_col_name) ALGORITHM [=] {DEFAULT|INPLACE|COPY}LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE }

ALGORITHM 制定了创建和删除索引的算法,COPY 选择创建临时表的方式;INPLACE 表示创建和删除索引不需要创建临时表;DEFAULT 会根据参数 old_alter_table 来判断是使用 INPLACE 算法还是 COPY 算法,该参数的默认值为 OFF,表示采用 INPLACE 方式。

LOCK 指定了创建和删除索引的时候添加锁的情况,NONE 表示不添加任何的锁;SHARE 表示添加 S 锁;EXCLUSIVE 表示添加 X 锁;DEFAULT 会根据并发性执行一个锁升级的过程,先判断是否可以使用 NONE 模式,若不能,再判断是否可以使用 SHARED 模式,否则将使用 EXCLUSIVE 模式。

三、联合索引

联合索引是指对表上的多个列进行索引。从本质上来说,联合索引也是一棵B+ 树。那么什么时候会使用到联合索引呢?"WHERE a= xxx and b=xxx" 和 "WHERE a= xxx" 都能使用到联合索引,但是"WHERE b= xxx"则使用不到这个索引,因为叶子节点上的 b 值是无序的,这也是人们常说的 —— 最左前缀匹配。除此之外,因为联合索引已经对键值进行了排序处理,因此对于索引列的排序操作也能使用到索引。

四、覆盖索引

覆盖索引是指从索引中就可以得到查询的记录,而不需要查询聚集索引中的整行记录的所有信息,因此可以减少大量的 IO 操作。比如只查询索引列的信息。

对于统计问题而言,在同时存在辅助索引和聚集索引的情况下,InnoDB 存储引擎会优先使用辅助索引来进行统计,因为辅助索引远小于聚集索引(辅助索引不需要维护整行记录的全部信息)。

此外,在通常情况下,诸如(a,b)的联合索引,一般是不可以选择列 b 作为查询条件。但是如果是统计操作,并且是覆盖索引的,则优化器会进行选择。

五、其他

当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),即使存在可以使用的辅助索引,优化器仍然会选择通过聚集索引来查找数据,因为顺序读要远大于离散读。这是由当前传统机械硬盘的特性所决定的,即利用顺序读来替换随机读的查找。可以使用关键字 FORCE INDEX 来强制使用某个索引。

Index Condition Pushdown(索引下推) 优化是 MySQL 5.6 开始支持的一种根据索引进行查询的优化方式,默认开启,使用 SET optimizer_switch = 'index_condition_pushdown=off'; 可以将其关闭。ICP 优化可以有效的提高查询效率。

null索引表键值_MySQL 的B+树索引相关推荐

  1. 注册表键值明明存在OpenSubKey始终返回null,解决方案

    注册表键值明明存在OpenSubKey始终返回null,解决方案 参考文章: (1)注册表键值明明存在OpenSubKey始终返回null,解决方案 (2)https://www.cnblogs.co ...

  2. VC删除注册表键值项

    2019独角兽企业重金招聘Python工程师标准>>> VC删除注册表键值项. HKEY hkResult; HKEY hKey=NULL; TCHAR lpFilename[MAX ...

  3. 控制Open With菜单项的注册表键值

    当右键单击一个文件的时候, 你会发现有一个菜单项叫做Open With. 为了说明问题, 我们在这里使用.xyz文件类型, xyzfile作为.xyz文件的ProgID. 某种文件的Open With ...

  4. 求助:Windows Service 读取注册表键值

    最近项目需要程序监控记录用户使用和打开的文件,于是做了一个使用Windows Service监控Recent文件夹中文件增加和更改的程序, 但是需要在服务程序确定Recent文件夹的路径,使用Regi ...

  5. Inno setup 访问注册表键值,获取软件安装路径

    ; 脚本由 Inno Setup 脚本向导 生成! ; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! [Setup] ; 注: AppId的值为单独标识该应用程序. ; 不要为其 ...

  6. mysql b-a全局索引_MySQL中B+树索引的使用

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

  7. mysql 添加b树索引_Mysql之B树索引

    聚集索引: 简单概念:一个表中根据主键创建的一棵B+树,索引的叶子节点存放了表中所有的记录,存储记录在物理位置上是连续的,一个叶子节点存放一条对应的记录(PS:是根据主键创建的B+树,叶子节点存数据记 ...

  8. mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)

    1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...

  9. 自制Windows 7 注册表键值修改服务(Service)

    首先说说为什么要写这么一个服务.由于电脑要在公司域中使用,所以不可避免的会继承域中的组策略配置.域中95% 的计算机是XP系统,部分组策略对于Windows 7 系统来说有些多余而且带来很多麻烦. 问 ...

最新文章

  1. ionic3学习之Android平台打包方式
  2. 深入理解卷II ---ICS源代码下载
  3. 为什么7层负载均衡压测性能低
  4. 【模型解读】GoogLeNet中的inception结构,你看懂了吗
  5. DRF (Django REST framework) 框架介绍(3)
  6. 2016-2017 Central Europe Regional Contest Hangar Hurdles 克鲁斯卡尔重构树 + 建图
  7. Eclipse安装以及JDK环境变量配置
  8. Docker搭建自己的GitLab
  9. 360健康助手文件存储位置 获取图片
  10. 2017年网络统考计算机成绩,2017年12月江苏省成人计算机基础统考成绩查询
  11. apollo集群部署_egg框架对接Apollo
  12. mysql 4升级,MySQL_Sql_打怪升级_进阶篇_进阶4:常见函数
  13. matlab处理hdf5数据画图,读取行的最佳HDF5数据集块形状
  14. msf 生成php马_PHP的性能优化方法总结
  15. Nginx 为什么快到停不下来?
  16. Atitit 获取SqlSessionFactory的三种方式 目录 第一节 DataSource 方式 1 第二节 读取sprbt Url方式 ByteArrayInputStream 1 第三节
  17. nmea怎么转wgs84坐标c语言源码,NMEA-0813数据格式说明
  18. bin文件python读取
  19. 改变世界的程序员—Jack Dorsey
  20. photoShop支持retina显示屏

热门文章

  1. cad和python哪个好学_cad制图工资一般多少 就业前景好不好
  2. 软件调试中的断点分类
  3. APIC ID 的通用七级解释与概念性六级拓扑:APICID
  4. TCP/IP网络协议栈:ARP协议详解
  5. DPDK无锁队列rte_ring相关代码及示例程序(rte_ring.h,rte_ring.c,main.c,makefile)
  6. Open5GS:开源5G
  7. python绘制矩形图_Python。在底图中绘制矩形
  8. Java中的枚举类型学习
  9. kafka修改分区数_ELK|kafka增加分区或调整副本数
  10. matlab转换为部分分式,matlab部分分式展开