mysql 丛集_MYSQL
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相关推荐
- jspstudy启动mysql失败_MySql启动数据库设置初始密码
这一小节介绍在Mac OS.Linux.Windows上启动关闭重启MySQL服务,以及部分图形化界面对服务的操控.安装完成后,可以使用 service 命令启动 mysql 服务,在Mac上serv ...
- 在线打mysql代码_mysql 在线alter table要留神_mysql
mysql 在线alter table要小心 mysql 5.6之前, alter table操作对可用性有巨大的冲击(除了纯改表名.不影响任何数据的alter table).它的原理是, 0. al ...
- 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 ...
- mysql配置_Mysql配置 max_allowed_packet
在使用Mysql过程中不知道小伙伴会不会遇到max_allowed_packet的问题.今天我给大家整理下关于Mysql max_allowed_packet的配置知识. 废话不多说,直接进入主题. ...
- centos mysql安装_mysql yum源安装
部署服务器环境的时候经常要安装mysql,以下是常见的安装方式 源码安装 rpm包安装 yum源安装 这篇主要介绍yum源安装. yum源下载 进入 https://dev.mysql.com/dow ...
- visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试...
一:背景 1. 讲故事 上一篇说了mysql的架构图,很多同学反馈说不过瘾,毕竟还是听我讲故事,那这篇就来说一说怎么利用visual studio 对 mysql进行源码级调试,毕竟源码面前,不谈隐私 ...
- .tar.gz mysql 安装_mysql tar.gz 版本 linux系统的安装-Go语言中文社区
mysql下载地址: https://dev.mysql.com/downloads/mysql/ 1. 上传下载的tar.gz文件发送到linux 上传的路径: /usr/local/mysql/ ...
- ssh 登陆mysql数据库_mysql命令行客户端如何通过ssh服务器连接数据库啊?
ssh到跳板机然后用 mysql 连接 利用ssh开启一个隧道 我这里的MySQL服务器是192.168.41.83, 我要在192.168.41.72连接 首先在192.168.41.72执行命令开 ...
- mysql 选项_mysql常用选项
欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 binlog-format可以取值: STATEMENT (default),ROW,MIXED.必须有SUPER才可以更 ...
最新文章
- tensorflow包_在Keras和Tensorflow中使用深度卷积网络生成Meme(表情包)文本
- (三)HTML 规范
- Exynos4412 中断驱动开发(一)—— 中断基础及中断的注册过程
- 二叉搜索时与双向链表python_【剑指offer】26 二叉搜索树与双向链表
- 如何实现用户通信授权的可信、可知、可追溯?——通信授权服务技术解读
- PHP处理图片导致内存溢出
- 封装批量获取键值对数据的方法
- idea debug的时候 启动起来超级慢
- 前端实现PDF文件下载的两种方式
- 如何避免由 Web 字体引起的布局偏移
- 百度地图开放平台web api 获取上海市所有小区信息
- linux计划任务5个*分表代表什么,Linux定时任务Crontab命令
- crm管理系统是什么意思 crm系统全称是什么 - whale帷幄
- mysql索引 b树_B树与MySQL数据库索引.ppt
- 11个趣味段子,个个蕴含深刻哲理!
- 《深度学习》(美)Ian Goodfellow 花书简要笔记(第二部分:深度网络)
- 缺少libGeographic.so,导致运行example-Geodesic-small 失败
- 讲真,这两款idea插件,能治愈你英语不好的病
- EffectiveJava(v3) - chapter3: Classes and Interfaces
- appdata文件夹有什么用途?C盘appdata可以删除吗?
热门文章
- python安装教程-01-Python安装教程与特色介绍-小白python入门基础
- 编程语言python怎么读-Python和Go都很火,我要怎么选?
- python画直方图-python plotly绘制直方图实例详解
- python使用缩进来体现-python使用缩进来体现代码之间的逻辑关系吗?
- python画3d图-python3利用Axes3D库画3D模型图
- python怎么读取csv文件-python3读取csv文件任意行列代码实例
- python读音Python怎么读
- 语音识别软件、语音识别平台和语音识别技术
- html缓存效果代码,html5缓存(示例代码)
- h5比html新增加的标签,H5新增的标签以及改良的标签