天水市建设银行官方网站,服务器网站搭建教程,wordpress 充值记录,深圳 倡导居家办公文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的#xff1f;1.1 MySQL的存储引擎有哪些#xff1f;1.2 MyIsam和InnoDB有什么区别#xff1f; 2.MySQL表的结构是什么#xff1f;2.1 行结构是什么样呢#xff1f;2.1.1 NULL列表#xff1f;2.1.2 char和varc… 文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的1.1 MySQL的存储引擎有哪些1.2 MyIsam和InnoDB有什么区别 2.MySQL表的结构是什么2.1 行结构是什么样呢2.1.1 NULL列表2.1.2 char和varchar 3.MySQL 缓存3.1 聚簇索引和非聚簇索引3.2 Buffer Pool3.2.1 什么是Buffer Pool3.2.2 空闲页3.2.3 脏页3.2.4 缓存命中率咋样脏页更新到磁盘时机呢1.预读失效2.Buffer Pool污染3.脏页更新时机 3.2.5 Buffer Pool可以代替Redis吗 二、SQL基础前言1.约束2.三范式3.SQL刷题网站 参考资料关于我的网站 一、存储引擎
1.MySQL中执行一条SQL语句的过程是怎样的 连接器查询缓存那缓存什么时候失效呢解析SQL执行SQL
语法树 1.1 MySQL的存储引擎有哪些 InnoDB 5.5之后MySQL默认的存储引擎支持事务和行级锁具有回滚和崩溃恢复功能。为什么InnoDB替代了MyIsam MyIsam 不支持事务和行级锁无法做到崩溃恢复。数据文件结构有.frm .myd .myi Memory 将数据存储到内存中可以快速访问数据并且这些数据不会被修改重启之后丢失也没问题。
1.2 MyIsam和InnoDB有什么区别
数据存储方式 InnoDB采用索引组织表索引即数据数据即索引。MyIsam采用堆表索引和数据完全分开。 锁 MyIsam仅支持表锁InnoDB支持表锁和行锁。 事务 MyIsam不支持事务。
堆表 堆表中的索引都是非聚簇索引没有聚簇索引这一说。由于索引的叶子节点存放的是堆表的物理地址如果堆表的数据发生变动那么索引将全部被动更新这是非常影响性能的。
索引组织表
索引组织表中是有聚簇索引和非聚簇索引的。非聚簇索引的变动不影响聚簇索引。
2.MySQL表的结构是什么
MySQL默认的是InnoDB存储引擎所以相关内容主要以InnoDB为主。 段用于存储具体对象比如数据段、索引段、Undo段新增数据时会分配新的区。区每个区是1mb包含64页。页是数据存储的基本单位每页16kb又根据不同的数据类型分为不同类型的页比如数据页、索引页、undo页、系统页、事务页。行行数据。
2.1 行结构是什么样呢 变长字符长度列表只出现在有变长字段的表记录中主要是根据这个变长字段去读取对应长度的数据。(varchar和char的区别)NULL值列表NULL是怎么存储的头信息 delete_mask表示这条数据是否删除执行DELETE的时候不是真的删除而是标记delete_mask1 。next_record下一条记录的位置。record_type表示记录类型0 普通记录1 非叶子节点2 最小记录3 最大记录。 row_id不是必须的如果没有主键或唯一约束就使用这个隐藏列。trx_id事务id表示是由那个事务生成的。6byteroll_ptr记录上一个版本的指针。
2.1.1 NULL列表
NULL值列表的大小是在插入行数据时根据每行数据中允许为NULL的列数量动态生成的。 列1不是NULL值用0表示。列2是NULL值用1表示。
一个字节最多可以表示8个列也就是说可以为null字段的列最少只需要1byte表示即可这样就大大节省空间了。
2.1.2 char和varchar
char是固定长度的字符串类型在系统中占用固定存储空间如果实际存储空间比较小用空格填充。
varchar可变长需要1-2字节存储可变长字符串的长度不会进行空格填充。
3.MySQL 缓存
3.1 聚簇索引和非聚簇索引 聚簇索引和非聚簇索引最主要的区别就是B树叶子节点存放的内容不同
聚簇索引的B树的叶子节点存放的是主键值和完整的记录非聚簇索引的B树叶子节点存放的是索引值和主键值。
如果查询条件用到了二级索引但是查询的数据不是主键值也不是二级索引值这时在二级索引找到主键值后就需要回表才能查找到数据需要扫描两次B树。
如果查询的是主键值因为在二级索引就能查询到那时候就会用到覆盖索引不需要回表只需要扫描一次B树。
3.2 Buffer Pool
3.2.1 什么是Buffer Pool
Buffer Pool就是MySQL为了提高查询性能的一个缓冲池位于存储引擎层。默认innodb_buffer_pool_size128MB。
InnoDB会为Buffer Pool申请一片连续的内存空间然后按照默认的16kb的大小划分出一个个页Buffer Pool中的页叫做缓存页。 为了管理这些缓存页InnoDB为每一个缓存都创建了一个控制块这些控制块包括【缓存页的表空间、页号、缓存页地址、链表节点】等。
3.2.2 空闲页
Buffer Pool是一片连续的内存空间但是在MySQL运行一段时间后肯定有空闲的也有被使用的。那么这些空闲页怎么办
我们下次读取磁盘数据的时候是要遍历Buffer Pool找到一个空闲页吗那也太浪费的吧。所以就为这些空闲页创建一个Free链表。
那么每当需要加载数据的时候直接在Free链表拿一个就行。
3.2.3 脏页
如果说我的缓存页被修改了那么就直接更新我的磁盘吗那也太拉低性能了吧。所以就设计了脏页由后台线程去更新到磁盘好了。
那么怎么找这个脏页呢那就创建一个链表吧就叫Flush链表。
3.2.4 缓存命中率咋样脏页更新到磁盘时机呢
对于这个Buffer Pool来讲我们当然希望访问次数多的一直留下访问次数少的就给他移除。
那么就使用LRU算法来实现这个功能具体LRU是什么呢可以看这篇文章。
https://blog.csdn.net/m0_73337964/article/details/144726361?spm1001.2014.3001.5501
如果直接使用LRU算法的话会出现两种问题预读失效和Buffer Pool污染。
1.预读失效
预读失效就是MySQL在访问数据时会顺带给邻居也读出来但是这些被提前读出来的邻居并没有被访问相当于这个预读白做了这就是预读失效。
要避免预读失效带来的影响最好就是让预读的页停留在Buffer Pool里的时间尽可能短让真正被访问的页移动到LRU链表头部从而保证真正的热数据留在Buffer Pool里的时间尽可能长。
MySQL将LRU链表分为了两个部分young和old区域。 预读的页加载到old区域头部当页真正被访问时才将其加入到young区域头部。
2.Buffer Pool污染
当某一个SQL语句在Buffer Pool比较有限的情况下可能会将Buffer Pool里的所有页都替换出去导致大量热数据被淘汰了等这些热数据又被再次访问的时候由于缓存未命中就会产生大量的IO这就是Buffer Pool污染。
MySQL的解决方案是进入到young区域条件增加了一个停留在old区域的时间判断。
如果后续的访问时间与第一次访问的时间在某个时间间隔内那么该缓存页就不会被从old区域移动到young区域的头部。如果后续的访问时间与第一次访问的时间不再某个时间间隔内那么该缓存页移动到young区域的头部。
间隔时间默认为innodb_old_blocks_time1000ms也就是说只有同时满足被访问与在old区域停留时间超过1秒两个条件才会被插入到young区域头部。
3.脏页更新时机
当redo log日志满了的情况下会主动触发脏页刷新到磁盘Buffer Pool空间不足时需要将一部分数据页淘汰掉如果淘汰的是脏页就先将脏页同步到磁盘空闲时后台线程定期将适量的脏页刷入到磁盘关闭前把所有脏页刷入到磁盘。
3.2.5 Buffer Pool可以代替Redis吗
我觉得不能代替。
因为MySQL的设计是进行持久化存储数据所有的模块设计主要关系到磁盘的IO性能在内存缓存方面并不是很迫切而Redis是存储在内存的数据库在内存层面操作具有每秒数十万次访问的高性能Redis 注重极致的内存操作效率而 MySQL 更关注数据的持久化和复杂查询能力所以不能代替。
二、SQL基础
前言
重点掌握AND、OR、IN、NOT IN、BETWEEN、LIKE、IS、NULL、EXISTS、DISTINCT。
JOIN内连接、左连接、外连接。UNION组合查询。
INSERT、DELETE、UPDATE。
聚合函数COUNT、MAX、MIN、SUM、AVG。
重点掌握GROUP BY和HAVING以及与Where的区别。
count(*)count(1)count(primary key field)count(field)
1.约束
主键约束唯一标识一条记录不能重复也不能为空一般会给id设置为主键。唯一约束保证字段在表中的数值是唯一的。非null约束保证字段不能为null。外键约束确保表与表之间的引用完整性。默认约束插入数据时给没有取值的字段设置默认值。
2.三范式
第一范式所有字段都是基本项。第二范式解决部分依赖关系。第三范式不允许存在传递依赖。
比如一个订单表
ID姓名单价数量总计1小明2051002李华301303张三10220
非主键字段完全依赖于主键订单编号符合第二范式。但是总计字段不是完全依赖主键字段ID可以由单价数量得到所以不符合第三范式。
数据库三范式主要是为了解决数据冗余、数据插入更新不一致性问题。
但是如果范式化的将数据分解为多个表那么查询数据的时候可能需要多表关联的操作那么成本是很高的所以有时业务场景采用字段冗余设计表避免联表查询。
3.SQL刷题网站
https://www.nowcoder.com/exam/oj?page1tabSQL%E7%AF%87topicId199
参考资料
1、https://xiaolincoding.com/mysql/base/how_select.html#%E9%A2%84%E5%A4%84%E7%90%86%E5%99%A8
2、https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/MySQL%E5%AE%9E%E6%88%98%E5%AE%9D%E5%85%B8/09%20%20%E7%B4%A2%E5%BC%95%E7%BB%84%E7%BB%87%E8%A1%A8%EF%BC%9A%E4%B8%87%E7%89%A9%E7%9A%86%E7%B4%A2%E5%BC%95.md
3、https://xiaolincoding.com/mysql/base/row_format.html#%E8%A1%A8%E7%A9%BA%E9%97%B4%E6%96%87%E4%BB%B6%E7%9A%84%E7%BB%93%E6%9E%84%E6%98%AF%E6%80%8E%E4%B9%88%E6%A0%B7%E7%9A%84
关于我的网站
最后关于我自己的网站GolangCode也是正式上线了。哈哈也是简单的搭建了一个vuepress-theme-hope主题的静态网站主要分享一些Go、MySQL、Redis等的后端开发编程笔记。如果有帮助的话可以给我点点star。
网站链接golangcode.cn 最后也是提前祝每一位还在努力提升技术的小伙伴新年快乐身体健康。