今日推荐为啥查询那么慢?

后端接口如何提高性能?

16 个写代码的好习惯

为什么不推荐使用BeanUtils属性转换工具

盘点阿里巴巴 34 个牛逼 GitHub 项目

常见代码重构技巧(非常实用)

来源:blog.csdn.net/that_is_cool/article/details/81069945

索引其实是一种数据结构,在数据库中,读写的比例是在10:1,所以如果每一次查找都全表查找的话,效率将会变的十分的低下。所以,本文将会按照题目,按部就班地讲解MySql的索引。

##B树和B+树 B树和B+树算是数据结构中出现频率十分高的模型了,在笔者之前的几篇博客,有对二叉查找树和二叉平衡树进行过讲解和代码分析,但是那些都是在程序中使用比较多的树,在数据库中,数据量相对较大,多路查找树显然更加适合数据库的应用场景,接下来我们就介绍这两类多路查找树,毕竟作为程序员,心里没点B树怎么能行呢?

B树:B树就是B-树,他有着如下的特性:

  • B树不同于二叉树,他们的一个节点可以存储多个关键字和多个子树指针,这也是B+树的特点;

  • 一个m阶的B树要求除了根节点以外,所有的非叶子子节点必须要有[m/2,m]个子树;

  • 根节点必须只能有两个子树,当然,如果只有根节点一个节点的情况存在;

  • B树是一个查找二叉树,这点和二叉查找树很像,他都是越靠前的子树越小,并且,同一个节点内,关键字按照大小排序;

  • B树的一个节点要求子树的个数等于关键字的个数+1;

好了,话不多说,看看B树的模型吧:

一个五阶的B树

由于B树将所有的查找关键字都放在节点中,所以查找方式和二叉查找十分相像,比如说查找E:

先通过根节点找到了左子树,再顺序地遍历左子树,发现E在F和J的中间,于是查找叶子节点,顺序遍历关键字以后就可以返回E了,如果未能查到E,则表示没有找到。

B+树

人人都喜欢plus,B+树就是这么一个plus,后头所讲解的索引,就是用的B+树,我们先来看看他的特性吧:

  • B+树将所有的查找结果放在叶子节点中,这也就意味着查找B+树,就必须到叶子节点才能返回结果;

  • B+树每一个节点的关键字个数和子树指针个数相同;

  • B+树的非叶子节点的每一个关键字对应一个指针,而关键字则是子树的最大,或者最小值;

看看模型吧:

一个3阶的B+树

他的查找方式也是简单粗暴的,和B树十分像,只不过他会在叶子节点中找到目标,比如我们找兔:

第一步比马小,就会查找他的子树,第二部比龙小,就会查找他的子树,最后在叶子节点中的关键字命中目标。

那么MySql是如何利用这数据结构的呢?

MySql中的两种常见存储引擎

MySql当然不止两种搜索引擎了,但是本次我们说的B+树索引,为接下来这两种存储引擎所用,一个是Innodb,一个Myisam。(搜索公众号Java知音,回复“2021”,送你一份Java面试题宝典)

Innodb存储引擎

Innodb使用的是B+树,他存在有一个主键索引和辅助索引两种索引,主键索引是在生成主键时就有的索引,他的叶子节点中存放的就是数据行,所以又称之为聚集索引。

而另一类索引,辅助索引,就是我们人为新建的索引,他的叶子节点中存放的是主键,当我们通过辅助索引查找到主键之后,再通过查找的主键去查找主键索引,我们看看两种索引的结构吧:

innodb主索引,其中叶子中存放的就是数据行

innodb辅助索引,其中叶子存放的是主键

MyIsam存储引擎

很显然,MyIsam不可能再会用聚集索引了,虽然他用的是B+树,但是他的主键索引和辅助索引没有任何区别,都是在叶子中存储数据行的物理地址,这也使得他的读性能更高,我们来看他的模型吧:

MyIsam存储引擎的主键索引

MyIsam存储引擎的辅助索引,存放的同样是物理地址

区别

1、innodb支持事务,且默认是Autocommit,所以每一条SQL语句都会封装成一个事务,如果执行多条事务,最好加上begin和commit。MyIsam不支持事务,也就无法回滚;

2、另外Innodb支持行锁,MyIsam进行写操作会全表上锁,所以MyIsam的写操作性能会差些;

3、所以,在查询较多的表中,使用MyIsam较优,写比较多的表,使用Innodb;

拓展--复合索引

我们都知道我们可以对一个列创建一个索引,但是什么是复合索引呢?

创建:

create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

通过以上代码我们就可以创建一个a、b、c三个字段的复合索引了,相对于维护三个索引,维护一个复合索引的开销肯定是更低的。

但是复合索引需要满足一个最左匹配原则,也就是他会依次查找a、b、c三个字段,当左边的字段未作为判断条件时,就不会再去执行接下来的索引了,测试如下:

EXPLAIN DELETE from test
where  a=1 and c= 3 and b =2

当a、b、c都有的时候,他会继续去匹配右边的字段
EXPLAIN DELETE from test
where  a=1 and c= 3

当去除b时,发现复合索引只匹配到a就结束了,并不会匹配c
推荐文章
  • 14个项目!

  • 一款小清新的 SpringBoot+ Mybatis 前后端分离后台管理系统项目

  • 47K Star 的SpringBoot+MyBatis+docker电商项目,附带超详细的文档!

  • 写博客能月入10K?

  • 一款基于 Spring Boot 的现代化社区(论坛/问答/社交网络/博客)

更多项目源码
  • 这或许是最美的Vue+Element开源后台管理UI

  • 推荐一款高颜值的 Spring Boot 快速开发框架

  • 一款基于 Spring Boot 的现代化社区(论坛/问答/社交网络/博客)

  • 13K点赞都基于 Vue+Spring 前后端分离管理系统ELAdmin,大爱

  • 想接私活时薪再翻一倍,建议根据这几个开源的SpringBoot

MySQL:从B树到B+树到索引再到存储引擎相关推荐

  1. 一起来聊一聊MySQL:从B树到B+树到索引再到存储引擎

    学习 Java 也有一年多了,但是从来没有就数据库做一个完整的总结,心血来潮立了这么一个网文标题,希望不要虎头蛇尾吧,哈哈. 索引其实是一种数据结构,在数据库中,读写的比例是在 10:1,所以如果每一 ...

  2. mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  3. MySQL性能调优与架构设计——第11章 常用存储引擎优化

    第11章 常用存储引擎优化 前言: MySQL 提供的非常丰富的存储引擎种类供大家选择,有多种选择固然是好事,但是需要我们理解掌握的知识也会增加很多.每一种存储引擎都有各自的特长,也都存在一定的短处. ...

  4. MySQL的三层架构(连接认证、解析优化和存储引擎)

    对于数据库的认识,相信很大一部分人像我一样只停留在写各种SQL.优化各种查询语句以及索引的建立之上,只是停留在"会用"的基础上.但是如果想要充分发挥MySQL的性能,就必须要了解其 ...

  5. mysql sga_MySQL王者晋级之路(一)安装、体系结构和存储引擎

    <MySQL王者晋级之路>张甦,电子工业出版社,2018.3 基于MySQL5.6和MySQL5.7 MySQL简介与主流分支版本 MySQL简介 MySQL AB -> Sun - ...

  6. MySQL面试知识点追命连环问(一)执行流程存储引擎查询缓存

    ​来了,朋友们,追命连环问系列之MySQL部分开始了.准备好了吗?本次连环问主要设计以下四个方面: MySQL执行流程 MySQL存储引擎 表字段如何设计 查询缓存 一,MySQL的执行流程 面试官: ...

  7. jdbc mysql查询显示图片_在实现JDBC时如何显示存储引擎-MySQL CONNECTION查询?

    使用SELECT ENGINE显示存储引擎名称.让我们首先创建一个表-create table DemoTable -> ( -> Id int NOT NULL AUTO_INCREME ...

  8. mysql中两种备份方法的优缺点_Mysql两种存储引擎的优缺点

    MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用.MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MY ...

  9. mysql数据库恢复数据_【技术分享】使用Innodb存储引擎的mysql数据库恢复

    作者:维一零 预估稿费:400RMB(不服你也来投稿啊!) 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 前言 某天,在测试一张新数据表的字段时,由于在phpmyadmin不断 ...

最新文章

  1. 剑指offer之【调整数组顺序使奇数位于偶数前面】
  2. ajax读取评论数据,评论提交使用ajax提交实现
  3. Unusual Competitions CodeForces - 1323C(思维)
  4. WinPcap笔记(3):获取已安装设备的详细信息
  5. marlin 三角洲_带火花的三角洲湖:什么和为什么?
  6. java程序员学习路线以及我的学习经验
  7. 论文浅尝 | ExCAR: 一个事件图知识增强的可解释因果推理框架
  8. 仿IOS介绍APP下载页源码
  9. 代码高亮插件——wangHightLighter.js——demo演示
  10. 第三天.SQL语言基础
  11. 强大的分组SectionListView, 支持自定义组头布局和分组的内容布局, 组头有挤压效果
  12. dell r510服务器怎么装系统,DELLR510服务器上安系统
  13. 9种AR/VR交互方式解读,让你更加了解透彻AR/VR
  14. 南方航空java面试_面试经验 南航面试经历分享
  15. 信道估计中的导频结构
  16. 新手小白如何用linux云服务器搭建wordpress个人网站
  17. java系列之J2ME的移动支付系统的设计与实现
  18. java毕业设计宝马官网Mybatis+系统+数据库+调试部署
  19. 田睿 php,家乐福中国CEO田睿:未来谋求独立上市
  20. java 可以继承不同包的类吗_深入理解JAVA中的跨包继承

热门文章

  1. 如何利用.pdb文件去调试
  2. hfs快速搭建HTTP文件服务器
  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)重载与模板
  4. HDU-2149(博弈)
  5. 【Flask】Flask-RESTful 风格编程
  6. 关于AttributeError: type object ‘XXX‘ has no attribute ‘XXX‘的问题
  7. 关于django—模型序列化器类详细内容
  8. CA/TA通信的share memory设计思想解读
  9. vc 限制软件的使用次数或时间
  10. c++11中智能指针的原理,使用,实现