Mysq数据库索引(B-Tree索引)
- 所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,如图所示,B-Tree索引的底层数据结构一般是B+树,反应了MyISAM索引是如何工作的。
- 全值匹配:全值匹配指的是和索引中的所有列进行匹配。
- 匹配最左前缀:前边提到的索引可以用于查找所有姓Allen的人,即只使用索引中的第一列。
- 匹配列前缀:也可以只匹配某一列的值的开头部分。例如前面提到的索引可用于查找所有以J开头的姓的人。这里也只用到了索引的第一列。
- 匹配范围值:例如前边提到的索引可用于查找姓在Allen和Barrymore之间的人。这里也只使用了索引的第一列。
- 精确匹配某一列并范围匹配另外一列:前边提到的索引也可用于查找所有姓为Allen,并且名字是字母K开头(比如Kim,Karl等)的人。即第一列last_name全匹配,第二列first_name范围匹配。
- 如果不是按照索引的最左列开始查找,则无法使用索引。例如上面例子中的索引无法查找名字为Bill的人,也无法查找某个特定生日的日,因为这两列都不是最左数据列。
- 如果查询中有某个列的范围查询,则其右侧所有列都无法使用索引优化查找。
- 聚簇索引的优点:
- 数据访问更快,聚簇索引将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找要快。
- 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。
- 聚簇索引的缺点:
- 插入顺序严重依赖插入顺序。按照主键的顺序插入是向InnoDB表中插入数据速度最快的方式,需要避免主键键值随机的(不连续且值得分布范围非常大)聚簇索引,比如使用UUID作为主键,而应该使用类似AUTO_INCREMENT的自增列。
- 更新聚簇索引列的代价很高,因为会强制InnoDB将每个被更新的行移动位置到新的位置。
- 基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行时,可能面临“页分裂”的问题。当行的主键值要求必须将这行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作。页分裂会导致表占用更多的磁盘空间。
- 二级索引可能比想象的更大,因为在二级索引中的叶节点包含了引用行的主键列。
- 二级索引访问需要两次索引查找,而不是一次。
- 索引条目数量和大小通常远小于数据行的条目和大小,所以如果只需要读取索引,那么MySQL就会极大地减少数据访问量。
- 因为索引是按照列顺序存储的,所以对于I/O密集型的范围查找会比随机从磁盘读取每一行数据的I/O要少的多。
- 由于InnoDB的聚簇索引,覆盖索引对InnoDB表特别有用。InnoDB的二级索引在叶子节点中保存了行的主键,索引如果二级主键能够覆盖查询,则避免对主键索引的第二次查询。
- MySQL索引背后的数据结构及算法原理 blog.codinglabs.org
- 《高性能MySQL》
Mysq数据库索引(B-Tree索引)的更多相关文章
- 论 数据库 B Tree 索引 在 固态硬盘 上 的 离散存储
传统的做法 , 数据库 的 B Tree 索引 在 磁盘上是 顺序存储 的 , 这是考虑到 磁盘 机械读写 的 特性 . 实际上 , B Tree 是一个 树形结构 , 可以采用 链式 存储 , 就是 ...
- MYSQL之B+TREE索引原理
1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...
- Oracle索引(B*tree和Bitmap)学习
在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引. (1).与索引相关 ...
- Oracle索引(B*tree与Bitmap)的学习总结
在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引.(1).与索引相关视 ...
- 数据库 MySQL进阶之索引
数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么 ...
- 数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B ...
- mysql索引 B+tree
一.B+tree示意图 二.为什么要用索引 1.索引能极大减少存储引擎需要扫描的数据量:因为索引有序所以可以快速查找并且不用全表查找: 2.索引可以把随机IO变为顺序IO:因为B+tree在数据中保存 ...
- mysql B+Tree索引
原文地址:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索 ...
- B-tree B+tree适合文件系统索引和MySQL索引
B-树 B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树 它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.下图是 B-树的简化图. B-树 ...
随机推荐
- 第3章 衡量线性回归的指标:MSE,RMSE,MAE
, , ,, , , ,
- 简说Spring中的资源加载
声明: 本文若有 任何纰漏.错误,请不吝指正!谢谢! 问题描述 遇到一个关于资源加载的问题,因此简单的记录一下,对Spring资源加载也做一个记录. 问题起因是使用了@PropertySource来进 ...
- 百万年薪架构师一文整理RabbitMQ、ActiveMQ、RocketMQ、Kafka
一般来说,大型应用通常会被拆分成多个子系统,这些子系统可能会部署在多台机器上,也可能只是一台机器的多个进程中,这样的应用就是分布式应用.在讨论分布式应用时,很多初学者会把它和集群这个概念搞混,因为从部 ...
- Java IO(十四) CharArrayReader 和 CharArrayWriter
Java IO(十四) CharArrayReader 和 CharArrayWriter 一.介绍 CharArrayReader 和 CharArrayWriter 是字符数组输入流和字符数组输出 ...
- python调用大漠插件教程01注册大漠
使用大漠有两种方法,一种是直接调用特殊的dll实现不注册就能使(本人不会),另一种则是注册后使用. 如何用python注册大漠? from win32com.client import Dispatc ...
- jchdl - GSL实例:FullAdder
https://mp.weixin.qq.com/s/CtT08xZON0YxnheqDM2FAw 全加器是能够计算低位进位的二进制加法电路.与半加器相比,全加器不只考虑本位计算结果是否有进位,也考虑 ...
- 多线程与RunLoop
iOS开发中的多线程 一个iOS程序,默认开启1条线程--主线程orUI线程 主线程主要作用: 显示/刷新UI界面 处理UI事件(点击.滚动.拖拽事件等) 主线程使用注 ...
- 高性能可扩展mysql 笔记(六) SQL执行计划及分页查询优化、分区键统计
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 常见业务处理 一.使用数据库处理常见业务: 案例: 如何对评论进行分页展示 使用 EXPLAIN 获得s ...
- JAVA-蓝桥杯-算法训练-字符串变换
问题描述 相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了.今天,徐老师想测试一下大家对于字符串操作的掌握情况.徐老师自己定义了1,2,3,4,5这5个参数分别指代不同的5种字符串 ...
- Java实现 LeetCode 355 设计推特
355. 设计推特 设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文.你的设计需要支持以下的几个功能: postTwee ...