在你享受工作舒适的同时,你的危机也已经在慢慢靠近
正确的创建合适的索引才是保证数据库性能保证的基础
1、索引的底层数据结构:hash,b树,b+树的区别,逐层分析为什么最后选用了b+树作为索引结构?
Mysql数据库索引的实现算法是基于B+树实现的。
数据库中数据查找的过程:MySQL 是基于磁盘的数据库系统,索引往往以索引文件的形式存储的磁盘上,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。
局部性原理与磁盘预读
由于磁盘的存取速度与内存之间鸿沟,为了提高效率,要尽量减少磁盘I/O.磁盘往往不是严格按需读取,而是每次都会预读,磁盘读取完需要的数据,会顺序向后读一定长度的数据放入内存。而这样做的理论依据是计算机科学中著名的局部性原理:
当一个数据被用到时,其附近的数据也通常会马上被使用
程序运行期间所需要的数据通常比较集中
由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。
如果要使查询效率提高,我们就得想办法减低树的层级高度,树的层级高度越低,查询速度就越快
- 二叉树:基本上都遵循左小右大的原则,最上层节点称之为跟节点,最下面的节点称之为叶子节点,也叫叶节点,中间的节点称之为枝节点
- B树:二叉树的每个叶子结点只存储一个元素,导致树的高度太高,因此让一个节点存储多个元素,降低树的整体层级高度,从而减少少磁盘访问次数,优化查询速度
数据结构 | 特点 |
B树 | 四路查找B树,何为四路,即每个节点中储存的元素数量数,也称为关键字数 1、非叶子节点的子节点数大于1,且小于或等于M,并且M大于1 2、所有子节点都是处于同一层级 3、非叶子节点里记录关键字、关键字的磁盘记录指针、指向其子节点指针 4、叶子节点里记录里关键字及关键字的磁盘记录指针,子节点指针为null 缺点:B树的子节点里记录里关键字及关键字的磁盘记录指针并且还有指向其子节点指针。当数据量很大时,整棵树的体量也会很大,每次读取到内存中的树的信息就会很大,消耗资源 |
B+树 | B树和B+树,本质上都是一样的 1、B+树所有的根节点和枝节点上只保存关键字索引和其子节点指针2、所有的数据信息都被保存到了叶子节点,这样每个枝节点可以存储更多的数据,从而降低树的层级高度, 3、所有叶子节点像是一个链表一样,指向右边的叶子节点,从而可以有效加快检索效率 4、如果需要遍历所有的数据,只需要遍历叶子节点链式结构即可 |
为什么使用 B+树
-
B+树更适合外部存储,由于内节点无 data 域,一个结点可以存储更多的内结点,每个节点能索引的范围更大更精确,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。
-
Mysql是一种关系型数据库,区间访问是常见的一种情况,B+树叶节点增加的链指针,加强了区间访问性,可使用在范围区间查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。
2、聚集索引、普通索引的区别、联系
3、索引建立的原则:
- 列的离散性,离散度越大,建立索引后的访问效果越好
- 最左匹配原则
- 联合索引(多列索引、而不是多个索引)
- 覆盖索引定义
- 一条慢SQL查询where后面有很多的查询字段,我们该如何建立联合索引?遵循的原则:最左匹配原则>离散度高原则>最少空间原则
- explain一条sql语句重点关注的列:type、possible kyes、rows
- 表中有name索引,where name like 'abc%'会用到索引么?为什么?在查询优化阶段会到表中对索引列的数据进行采样,如果采样结果判断出该列的离散性太差,那么也可能导致不会走索引进而进行全表数据的扫描。