当前位置:首页 > 经验 >

数据库系统原理学习(数据库系统概论学习方法)

来源:原点资讯(www.yd166.com)时间:2022-11-06 09:32:53作者:YD166手机阅读>>

客户端/服务端通信协议

MySQL客户端/服务端通信协议是“半双工”的:在任一时刻,要么是服务器向客户端发送数据,要么是客户端向服务器发送数据,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法也无须将一个消息切成小块独立发送,也没有办法进行流量控制。

客户端用一个单独的数据包将查询请求发送给服务器,所以当查询语句很长的时候,需要设置max_allowed_packet参数。但是需要注意的是,如果查询实在是太大,服务端会拒绝接收更多数据并抛出异常。

与之相反的是,服务器响应给用户的数据通常会很多,由多个数据包组成。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。

查询缓存

在解析一个查询语句前,如果查询缓存是打开的,那么MySQL会检查这个查询语句是否命中查询缓存中的数据。如果当前查询恰好命中查询缓存,在检查一次用户权限后直接返回缓存中的结果。这种情况下,查询不会被解析,也不会生成执行计划,更不会执行。

MySQL将缓存存放在一个引用表(不要理解成table,可以认为是类似于HashMap的数据结构),通过一个哈希值索引,这个哈希值通过查询本身、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息计算得来。所以两个查询在任何字符上的不同(例如:空格、注释),都会导致缓存不会命中。

如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL库中的系统表,其查询结果都不会被缓存。比如函数NOW()或者CURRENT_DATE()会因为不同的查询时间,返回不同的查询结果,再比如包含CURRENT_USER或者CONNECION_ID()的查询语句会因为不同的用户而返回不同的结果,将这样的查询结果缓存起来没有任何的意义。

既然是缓存,就会失效,那查询缓存何时失效呢?MySQL的查询缓存系统会跟踪查询中涉及的每个表,如果这些表(数据或结构)发生变化,那么和这张表相关的所有缓存数据都将失效。正因为如此,在任何的写操作时,MySQL必须将对应表的所有缓存都设置为失效。如果查询缓存非常大或者碎片很多,这个操作就可能带来很大的系统消耗,甚至导致系统僵死一会儿。而且查询缓存对系统的额外消耗也不仅仅在写操作,读操作也不例外:

  1. 任何的查询语句在开始之前都必须经过检查,即使这条SQL语句永远不会命中缓存
  2. 如果查询结果可以被缓存,那么执行完成后,会将结果存入缓存,也会带来额外的系统消耗

基于此,我们要知道并不是什么情况下查询缓存都会提高系统性能,缓存和失效都会带来额外消耗,只有当缓存带来的资源节约大于其本身消耗的资源时,才会给系统带来性能提升。但要如何评估打开缓存是否能够带来性能提升是一件非常困难的事情,也不在本文讨论的范畴内。如果系统确实存在一些性能问题,可以尝试打开查询缓存,并在数据库设计上做一些优化,比如:

  1. 用多个小表代替一个大表,注意不要过度设计
  2. 批量插入代替循环单条插入
  3. 合理控制缓存空间大小,一般来说其大小设置为几十兆比较合适
  4. 可以通过SQL_CACHE和SQL_NO_CACHE来控制某个查询语句是否需要进行缓存

最后的忠告是不要轻易打开查询缓存,特别是写密集型应用。如果你实在是忍不住,可以将query_cache_type设置为DEMAND,这时只有加入SQL_CACHE的查询才会走缓存,其他查询则不会,这样可以非常自由地控制哪些查询需要被缓存。

数据库系统原理学习,数据库系统概论学习方法(5)

当然查询缓存系统本身是非常复杂的,这里讨论的也只是很小的一部分,其他更深入的话题,比如:缓存是如何使用内存的?如何控制内存的碎片化?事务对查询缓存有何影响等等,读者可以自行阅读相关资料,这里权当抛砖引玉吧。

语法解析和预处理

数据库系统原理学习,数据库系统概论学习方法(6)

MySQL通过关键字将SQL语句进行解析,并生成一颗对应的解析树。

这个过程解析器主要通过语法规则来验证和解析。比如SQL中是否使用了错误的关键字或者关键字的顺序是否正确等等。预处理则会根据MySQL规则进一步检查解析树是否合法。比如检查要查询的数据表和数据列是否存在等。

SQL总体执行流程图

数据库系统原理学习,数据库系统概论学习方法(7)

查询优化

数据库系统原理学习,数据库系统概论学习方法(8)

栏目热文

数据库系统基础(数据库系统基础笔记)

数据库系统基础(数据库系统基础笔记)

1、数据库底层MySQL数据库的底层是B 树。说到B 树,先说下B树,B树也叫多路平衡查找树,所有的叶子节点位于同一层,...

2022-11-06 10:09:42查看全文 >>

数据库系统典型架构(数据库系统设计框架)

数据库系统典型架构(数据库系统设计框架)

本文,将介绍数据库架构设计中的一些基本概念,常见问题以及对应解决方案,为了便于读者理解,将以“用户中心”数据库为例,讲解...

2022-11-06 10:07:43查看全文 >>

数据库系统原理及应用(数据库系统发展过程)

数据库系统原理及应用(数据库系统发展过程)

一、摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,...

2022-11-06 10:00:09查看全文 >>

数据库系统原理课后题(数据库系统的基本原理答案)

数据库系统原理课后题(数据库系统的基本原理答案)

更多真题详情可联系冯老师,...

2022-11-06 09:43:00查看全文 >>

数据库系统原理详细版(数据库的原理图解)

数据库系统原理详细版(数据库的原理图解)

数据库系统原理【课程代码:04735】模拟测试《数据库系统原理》模拟测试一一、单项选择题:本大题共 15 小题,每小题 ...

2022-11-06 09:51:32查看全文 >>

常见的数据库系统(目前流行的数据库系统有哪些)

常见的数据库系统(目前流行的数据库系统有哪些)

图片来源@视觉中国文 | 钛资本研究院中国数据库市场将迎来高增长态势,原因有四点:首先是政策利好,国家大力支持国产数据库...

2022-11-06 10:07:38查看全文 >>

梦见好多熟肉是啥意思(梦见好多熟肉好吗)

梦见好多熟肉是啥意思(梦见好多熟肉好吗)

呼。洛倾城缓缓吐出一口浊气,嘴角泛起一丝微笑。如果没有一代老祖的帮助,别说剑痴了,就算叶尘她都打不过。武灵儿与忘仙宗众弟...

2022-11-06 09:55:30查看全文 >>

梦见生肉和熟肉是什么意思(梦见自己吃熟肉是啥意思)

梦见生肉和熟肉是什么意思(梦见自己吃熟肉是啥意思)

(内容有些专业,感兴趣的读者请耐心理解看完!想直接看解梦的读者,可以拉倒中后部分)做梦,对我们来说都不陌生。有时候我们会...

2022-11-06 09:55:43查看全文 >>

正宗重庆粉蒸排骨正宗做法(正宗的重庆粉蒸排骨怎样做好吃)

正宗重庆粉蒸排骨正宗做法(正宗的重庆粉蒸排骨怎样做好吃)

粉蒸排骨是一道四川的汉族名菜,属于川菜。鲜嫩的排骨,再加上软糯的米粉,吃起来鲜香美味,肥而不腻,软烂入味,让人回味无穷...

2022-11-06 09:48:36查看全文 >>

重庆粉蒸排骨的做法视频(正宗重庆粉蒸排骨做法教学视频)

重庆粉蒸排骨的做法视频(正宗重庆粉蒸排骨做法教学视频)

大家好,粉蒸排骨相信很多地方的人们都很喜欢吃,那么对于广西人的粉蒸排骨制作方法,不知道你们会不会做呢?如果你是一个很爱吃...

2022-11-06 09:59:40查看全文 >>

文档排行