MySQL的逻辑结构

客户端+服务器+存储引擎

存储引擎

查看存储引擎: show engines.我的电脑里默认的是InnoDB;

InnoDB和MyISAM索引采用的是B+树, MEMORY采用的是Hash索引.

MySql中最常用的的存储引擎是InnoDB和MyISAM.

前者在磁盘中会落2个文件,分别是.frm和.ibd..frm代表form files,代表格式文件..ibd中包含真实数据和索引数据.

而myISAM中会落3个文件,分别是.frm,.MYD和.MYI,其中后面两种格式代表真实数据和索引数据.

内存和磁盘交互:

磁盘预读:预读的长度一般是页的整数倍.页是存储器(包括内存和磁盘)的逻辑块,通常为4KB,内存和磁盘以页来为单位交换数据.InnoDB默认一次预读16KB的数据.

索引:

为什么要创建索引:

如果没有索引,查找数据是全表扫描,而如果有索引的话,会按照B+树的结构去查找数据.

创建索引是个什么过程?

就是把数据组织成数据结构的过程.

存储在文件系统中,存储形式和存储引擎有关,索引文件的结构包括hash,二叉树,B树和B+树.

hash表:是数组+链表的结构.

hash作为索引存在的问题 :

1.哈希函数不容易选择

2.hash存储需要将所有的数据文件添加到内存(why?待后知后觉),浪费内存空间.

3.等值查询用hash比较快,但是实际中范围查询更多,hash不太合适.

以上问题使得hash没有作为大部分存储引擎(查找数据是与磁盘进行交互)的数据结构.而MEMORY存储引擎是在内存中进行的,使用它的时候就接受它占内存的问题了,另外在内存中查找速度很快.

二叉树,红黑树存在的问题:

树中元素存储的是数据值,树在物理结构上是数组进行存放的,可能逻辑结构上很近的数据(比如父子)在物理结构上会相差很远(比如当树很大时).因此,每次读取磁盘页的数据很多是用不上的.可能需要进行很多次的IO交互才能够找到要找的数据.

都会因为树的深度太深而造成io次数变多(指的是内存和磁盘交互的次数),影响读取的效率.

提升IO效率的两个方法:

1.减少IO的次数

2.减少IO的大小

eg:不推荐使用select(*)的原因,是因为它会把磁盘中全表的数据都拉到内存(mysql的服务)中,然后在内存中去进行筛选,筛选完毕后给到客户端中.

B树:

树中节点存储的是数据块.

图中紫色的代表键值,它可能是记录的主键.

树的阶数(degree)等于它可以最多存储指针的个数(数据的个数比指针个数少1).

比如下面的这个示意图,它最多能够存3个指针,两个data,它的degree是3.

假如当前磁盘块的大小为16KB,每个data占1KB的内存,忽略键值和指针,一个磁盘块中可以存16个data,即阶为17.那么三层树可以存储的数据量16+17*16+17*17*16=16*(1+17+17*17)=4912条数据.从这里可以看出来影响存储数据多少的因素是data的大小,而这个时候B+树就比较合适了.

B+树:

同样的3层树,如果前两层只存储键值和指针的话,那么对应存储的指针数就会大大增加,假如前两层每个磁盘可以存储1600个指针,第三层仍然是存储16个数据,那么三层树总共可以存储的数据量=1600*1600*16 = 40960000,差不多数据容量增加了1万倍.

注意这里为什么特别在意树的层数呢?因为树的层数越深,查找树的次数就越多(最坏情况,单枝退化成了链表).

B+树中有两种查找方式:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找.

InnoDB和MyISAM所以创建的区别:

InnoDB,叶子节点中放置的是数据,对应.ibd, 聚簇/聚集索引.

注意:

1.InnoDB对主键创建索引,也就是把主键作为B+树中的Key,如果没有主键,会选择唯一键,如果没有唯一键,会生成一个6字节的row_id(不可见)来作为主键(都是为了保证key的唯一性).

2.如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录,这个过程叫做回表.

比如下图中又对表中的name建立了索引(称为二级索引/辅助索引),如果要执行select * from table where name = "ma",根据"ma"找到了主键1,这个时候还需要根据主键回到表中查找所有的列.而如果select id from table where name = "ma"的话,则不会触发回表.

MyISAM中叶子节点冲存储的是地址,然后根据地址去查找数据.所以存储文件是.MYI,.MYD. 非聚簇索引.

MySQL的B+树三层还是四层,取决于数据量的多少.

主键自增:

分布式不推荐(分布式中有自己的主键生成策略),

非分布式推荐.

主键自增,能够保证后面插入的数据在建立索引时从添加到树的结尾.如果主键是乱序的话,在创建索引时,会插入到中间位置.如果中间位置满了,会导致页分裂,会造成维护上很麻烦.(添加到结尾,如果数据满了也会造成页分裂,但没有中间插入的那种情况严重).

索引优化相关:

1.尽量用int来存储索引,它只占4个字节,而varchar会占用比较多的字节.

2.

mysql 丛集_MYSQL相关推荐

  1. jspstudy启动mysql失败_MySql启动数据库设置初始密码

    这一小节介绍在Mac OS.Linux.Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控.安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上serv ...

  2. 在线打mysql代码_mysql 在线alter table要留神_mysql

    mysql 在线alter table要小心 mysql 5.6之前, alter table操作对可用性有巨大的冲击(除了纯改表名.不影响任何数据的alter table).它的原理是, 0. al ...

  3. Warring the /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql' user

    /usr/local/mysql/data的宿主发生了改变 sudo chown -R mysql /usr/local/mysql/data 或者 sudo chown -R _mysql:whee ...

  4. mysql配置_Mysql配置 max_allowed_packet

    在使用Mysql过程中不知道小伙伴会不会遇到max_allowed_packet的问题.今天我给大家整理下关于Mysql max_allowed_packet的配置知识. 废话不多说,直接进入主题. ...

  5. centos mysql安装_mysql yum源安装

    部署服务器环境的时候经常要安装mysql,以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装. yum源下载 进入 https://dev.mysql.com/dow ...

  6. visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试...

    一:背景 1. 讲故事 上一篇说了mysql的架构图,很多同学反馈说不过瘾,毕竟还是听我讲故事,那这篇就来说一说怎么利用visual studio 对 mysql进行源码级调试,毕竟源码面前,不谈隐私 ...

  7. .tar.gz mysql 安装_mysql tar.gz 版本 linux系统的安装-Go语言中文社区

    mysql下载地址: https://dev.mysql.com/downloads/mysql/ 1.  上传下载的tar.gz文件发送到linux 上传的路径: /usr/local/mysql/ ...

  8. ssh 登陆mysql数据库_mysql命令行客户端如何通过ssh服务器连接数据库啊?

    ssh到跳板机然后用 mysql 连接 利用ssh开启一个隧道 我这里的MySQL服务器是192.168.41.83, 我要在192.168.41.72连接 首先在192.168.41.72执行命令开 ...

  9. mysql 选项_mysql常用选项

    欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 binlog-format可以取值: STATEMENT (default),ROW,MIXED.必须有SUPER才可以更 ...

最新文章

  1. tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本
  2. (三)HTML 规范
  3. Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程
  4. 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
  5. 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
  6. PHP处理图片导致内存溢出
  7. 封装批量获取键值对数据的方法
  8. idea debug的时候 启动起来超级慢
  9. 前端实现PDF文件下载的两种方式
  10. 如何避免由 Web 字体引起的布局偏移
  11. 百度地图开放平台web api 获取上海市所有小区信息
  12. linux计划任务5个*分表代表什么,Linux定时任务Crontab命令
  13. crm管理系统是什么意思 crm系统全称是什么 - whale帷幄
  14. mysql索引 b树_B树与MySQL数据库索引.ppt
  15. 11个趣味段子,个个蕴含深刻哲理!
  16. 《深度学习》(美)Ian Goodfellow 花书简要笔记(第二部分:深度网络)
  17. 缺少libGeographic.so,导致运行example-Geodesic-small 失败
  18. 讲真,这两款idea插件,能治愈你英语不好的病
  19. EffectiveJava(v3) - chapter3: Classes and Interfaces
  20. appdata文件夹有什么用途?C盘appdata可以删除吗?

热门文章

  1. python安装教程-01-Python安装教程与特色介绍-小白python入门基础
  2. 编程语言python怎么读-Python和Go都很火,我要怎么选?
  3. python画直方图-python plotly绘制直方图实例详解
  4. python使用缩进来体现-python使用缩进来体现代码之间的逻辑关系吗?
  5. python画3d图-python3利用Axes3D库画3D模型图
  6. python怎么读取csv文件-python3读取csv文件任意行列代码实例
  7. python读音Python怎么读
  8. 语音识别软件、语音识别平台和语音识别技术
  9. html缓存效果代码,html5缓存(示例代码)
  10. h5比html新增加的标签,H5新增的标签以及改良的标签