mysql深入浅出(一)

最近看了Mysql有关得资料,接下来就边写边回忆下吧。

首先讲讲mysql底层是如何存储数据得

这就不免说到四个数据结构:二叉树、红黑树(平衡二叉树)、B树、B+树、以及Hash。
二叉树这边就不解释了。讲讲红黑树吧也称平衡二叉树,下面直接放图

下面再来讲讲B树,有下面几个注意点
1、叶节点具有相同的深度,叶节点的指针为空。
2、所有索引元素不重复。
3、节点中的数据索引从左到右递增排列。

再讲讲B+树:
B+Tree(B-Tree变种)
非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间访问的性能 (mysql优化成了双向指针)

那Mysql为啥会选B+树,下面我们来展开说说。
1、首先B+树叶子节点有双向指针,查询效率高,而B树没有
2、mysql指定但内存约为16kb左右,使用b+树可以减少层级,只需要三层就可以大概存放1170117016约2000w得数据也就是说只要三次I/O操作就可以查到所需数据。而查询中I/O操作是比较费时间得。
Hash结构我想大家也不陌生
1、对索引的key进行一次hash计算就可以定位出数据存储的位置
2、很多时候Hash索引要比B+ 树索引更高效
3、仅能满足 “=”,“IN”,不支持范围查询
4、hash冲突问题

了解了这几种数据结构后那我们来聊聊Mysql底层到底是怎么存储得吧。先来说说得Mysql得默认存储引擎MyISAM吧。
走下面这张图很明显可以看出来索引文件和数据文件是分离的(非聚集索引)
如果要查询得话mysql会先在树结构里面找到该索引,叶子节点会存索引和存放数据得磁盘地址,然后会根据坐标再去数据文件里面找到对应数据。这样查询就会比较慢。

下面再来聊聊InnoDB引擎索引实现(聚集索引)有俩个经典问题
表数据文件本身就是按B+Tree组织的一个索引结构文件
聚集索引-叶节点包含了完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
1、如果不建主键得话InnoDB会自己去寻找表中没有重复数据得列作为索引,如果没有这样得列则InnoDB会自己生成一个数据不重复隐藏列来作为索引,这样会消耗资源。
2、那为什么又要使用整形自增主键呢?首先整形占内存小节约空间,其次索引是按顺序存放的整形数据比较大小效率更高。而自增得话是因为索引插入树得时候会按照顺序排列,插入得时候如果无序插入会造成叶子节点分裂,并且树结构可能会重新平衡效率会变低,而一直自增插入得话只会在后面开辟新节点。效率更高

为什么非主键索引结构叶子节点存储的是主键值?
保证一致性和节省存储空间

InnoDB其实还有一种存储结构Hash结构,这种结构用的很少,稍微讲一下,他查询很快但只满足与=和IN,他不支持范围查询

下面再来俩聊联合主键索引如下图

这边要注意最左前缀原则。举个例子如果查name会走索引,如果查name age也会走索引,而如果直接查age则不会走索引。

Mysql深入浅出(一)相关推荐

  1. 《MySQL 深入浅出》 1-17章节 阅读整理

    链接:http://blog.itpub.net/28602568/viewspace-1622174/ 标题: <MySQL 深入浅出> 1-17章节 阅读整理 作者:lōττéry©版 ...

  2. mysql深入浅出_《深入浅出mysql》学习笔记

    一:sql分类及语法 1.sql分类: (1)DDL:数据库定义语言,用于定义表,列,索引等数据库对象. create,drop,alter等 (2)DML:数据库操纵语言,增删改查数据库的记录ins ...

  3. MySQL深入浅出之索引

    文章目录 1. 简介 2. 索引的常见模型 2.1 哈希表 2.2 有序数组 2.3 二插搜索树 2.4 多叉树(N叉树) 2.5 B+树 真实的数据库索引结构 3. InnoDB的索引模型 3.1 ...

  4. MYSQL 深入浅出索引(下)

    日常读书笔记 区间查询的流程 覆盖索引出现的原因 联合索引以及最左前缀原则 索引下推

  5. MySQL 深入浅出索引(上)

    日常读书笔记 索引的作用 索引的常见类型 InnoDB的索引模型 索引维护

  6. mysql longtext 默认_mysql+longtext+默认值

    MySQL---数据类型和表的基本操作 版权声明:本文为博主原创文章,转载请注明出处.https://blog.csdn.net/twilight_karl/article/details/74027 ...

  7. 死磕mysql_死磕mysql

    数据库创建语句 create database new; 创建一个名为new 的数据库 drop database new; 删除名为new的数据库 数据库名为小写,当初教我的那个人对我说在某个系统中 ...

  8. mysql 存储过程 replace_mysql 存储过程 create or replace

    MySQL和Oracle对比之存储过程 昨天晚上帮一个朋友处理了一个关于存储过程的问题,他需要迁移一些Oracle中的存储过程到MySQL中来,但是改了一部分的程序,发现MySQL中没法编译了,报了很 ...

  9. c语言程序竞赛,2015年江西理工大学C语言程序设计竞赛(初级组)

    JankTao相亲记 解法:排序 #include #include #include #include #include #include #include #include using names ...

最新文章

  1. (Spring)概述及IOC
  2. Linux删除整行命令
  3. kotlin之重载运算符(十一)
  4. 我的做题日志(1),来源:COCI2017,SDOJ
  5. 前端学习(2240):构造Vue的的利器-脚手架vue-cli3
  6. 常用数据验证正则表达式释义(附:正则表达式常用符号)
  7. 关于看板方法,你需要知道的几件事
  8. java文件复制(可过滤)
  9. 关于树的前序遍历,中序遍历,后序遍历的相互转化(含代码实现)
  10. 一站式学习Redis 从入门到高可用分布式实践(慕课)第三章 Redis客户端
  11. java runnable 匿名_Java 开发者最困惑的四件事
  12. 将图片url转换成 BufferedImage
  13. Android如何实现汉字手写输入法(带中文自动识别提示)
  14. 怎么给word文档注音_怎么为整篇word文字添加拼音标注
  15. Python自动化测试框架有哪些?(总结几种)
  16. 使用cmd命令清空windows中C盘的所有临时文件
  17. 使用face-api.js人脸识别让照片中的人物自动流汗(自动流汗黄豆/差不多得了)
  18. arm体系结构总结笔5-总线接口
  19. 2个DIV制作十字架
  20. 【C语言】0x1F<<11等于0还是0xF800 ?

热门文章

  1. Linux locale lang
  2. 二进制转十进制的简便方法
  3. 删除我的电脑中360随身WiFi云U盘的图标
  4. Prezi实战 ------ 一款颠覆性的做presentation的软件
  5. sci论文配色-科研论文可视化绘图配色(转送站)
  6. 生日快乐的网页(用HTML和JavaScript)
  7. 维数的性质及其哲学意义
  8. 深搜6:【SSL】1328.泡泡龙——2021-05-01更
  9. Centos 7.3 下 的QT 输入中文
  10. Lavarel 5.5安装步骤整理