《Mysql是怎样运行的》第一章读书笔记

  • 环境变量

    • 环境变量PATH是一系列路径的集合,各个路径之间使用冒号(:)隔离开。比如,在我的机器上,环境变量PATH的值为/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin。这个值表明,在我输入某个命令时,系统会在/usr/local/bin、/usr/bin、/bin、/usr/sbin和/sbin目录下按照顺序依次寻找输入的这个命令.如果寻找成功,则执行该命令.也可以修改这个环境变量PATH.把MySQL安装目录下的bin目录的绝对路径添加到PATH中.这样一来,无论命令行解释器的当前工作目录是啥,都可以直接输入可执行文件的名字来启动,比如下面这样:
      • mysqld
  • 客户端与服务器连接的过程

    • TCP/IP
      • 在真实环境中,数据库服务器进程和客户端进程可能运行在不同的主机中,它们之间必须通过网络进行通信.MySQL采用TCP作为服务器和客户端之间的网络通信协议。在网络环境下,每台计算机都有一个唯一的IP地址,如果某个进程需要采用TCP协议进行网络通信,就可以向操作系统申请一个端口号.端口号是一个整数值,它的取值范围是0~65535.这样,网络中的其他进程就可以通过IP地址+端口号的方式与这个进程建立连接,这样进程之间就可以通过网络进行通信了。MySQL服务器在启动时会默认申请3306端口号,之后就在这个端口号上等待客户端进程进行连接.用书面一点的话来说,MySQL服务器会默认监听3306端口.
      • 如果3306端口号已经被别的进程占用,或者我们单纯地想自定义该服务器进程监听的端口号,就可以在启动服务器程序的命令行中添加-P参数来明确指定端口号,比如这样·
        • mysqld -P3307
      • 这样MySQL服务器在启动时就会去监听指定的端口号3307.
      • 如果客户端进程想要使用TCP/IP网络与服务器进程进行通信,那么我们在使用mysql命令启动客户端程序时,在-h参数后必须跟随IP地址来作为需要连接的服务器进程所在主机的主机名。如果客户端进程和服务器进程位于同一台计算机中,则可以使用127.0.0.1来代表本机的IP地址。另外,如果服务器进程监听的端口号不是默认的3306,我们也可以在使用mysql命令启动客户端程序时使用-P参数(注意是大写的p,小写的p是用来指定密码的)指定需要连接的端口号。比如我们现在已经在本机启动了服务器,监听的端口号为3307,我们在启动客户端程序时可以这样写:
        • mysql - h127.0.0.1 -uroot -P3307 -p
    • 命名管道和共享内存
    • UNIX域套接字
  • 服务器处理客户端请求

    • 其实,无论客户端进程和服务器进程采用哪种方式进行通信,最后实现的效果都是客户端进程向服务器进程发送一段文本(MySQL语句).服务器进程处理后再向客户端进程返回一段文本(处理结果)

    • 户端可以向服务器发送增删改查等各类请求,这里以比较复杂的查询请求为例来展示一下大致的过程
      在这里插入图片描述

    • 连接管理

      • 客户端进程可以采用前面介绍的TCP/IP、命名管道或共享内存、UNIX域套接字等几种方式与服务器进程建立连接.每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程专门处理与这个客户端的交互;当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端.这样就不用频繁地创建和销毁线程,从而节省了开销.MYSQL服务器会为每一个连接进来的客户端分配一个线程,但是线程分配得太多会严重影响系统性能,所以我们也需要限制可以同时连接到服务器的客户端数量
      • 在客户端程序发起连接时,需要携带主机信息、用户名、密码等信息,服务器程序会对客户端程序提供的这些信息进行认证.如果认证失败,服务辑程序会拒绝连接.另外,如果客户端程序和服务器程序不运行在一台计算机上,我们还可以通过采用传输层安全性(Transport Layer Security, TLS)协议对连接进行加密,从而保证数据传输的安全性。
      • 当连接建立后,与该客户端关联的服务器线程会一直等待客户端发送过来的请求.MySQL服务器接收到的请求只是一个文本消息,该文本消息还要经过各种处理.
    • 解析与优化

      • 查询缓存
        • MySQL服务器程序处理查询请求会把刚刚处理过的查询请求和结果缓存起来.如果下一次有同样的请求过来,直接从缓存中查找结果就好了,就不用再去底层的表中查找了.这个查询缓存可以在不同的客户端之间共享,也就是说,如果客户端A刚刚发送了一个查询请求,而客户端B之后发送了同样的查询请求,那么客户端B的这次查询就可以直接使用查询缓存中的数据了.
        • 如果两个查询请求有任何字符上的不同(例如,空格、注释、大小写).都会导致缓存不会命中.另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、系统表,如mysql、information_schema、performance_schema数据库中的表,则这个请求就不会被缓存.以某些系统函数为例,同一个函数的两次调用可能会产生不一样的结果.比如函数NOW.每次调用时都会产生最新的当前时间.如果在两个查询请求中调用了这个函数,即使查询请求的文本信息都一样,那么不同时间的两次查询也应该得到不同的结果.如果在第一次查询时就缓存了结果,在第二次查询时直接使用第一次查询的结果就是错误的!
        • 不过既然是缓存,那就有缓存失效的时候.MySQL的缓存系统会监测涉及的每张表,只要该表的结构或者数据被修改,比如对该表使用了的INSERT、UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或DROP DATABASE语句,则与该表有关的所有查询缓存都将变为无效并从查询缓存中删除!
        • 虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销.比如每次都要去查询缓存中检索,查询请求处理完后需要更新查询缓存,需要维护该查询缓存对应的内存区域等.从MySQL5.7.20开始,不推荐使用查询缓存,在MySQL8.0中直接将其删除.
      • 语法解析
        • 如果查询缓存没有命中,接下来就需要进入正式的查询阶段了.因为客户端程序发送过来的请求只是一段文本,所以MySQL服务器程序首先妥对这段文本进行分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到MySQL服务器内部使用的一些数据结构上。
      • 查询优化
        • 在语法解析之后,服务器程序获得到了需要的信息,比如要查询的表和列是哪些、搜索条件是什么等。但光有这些是不够的,因为我们写的MySQL语句执行起来效率可能并不是很高,MySQL的优化程序会对我们的话句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等一堆东西。优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引执行查询,以及表之间的连接顺序是啥样,等等。我们可以使用EXPLAIN语句来查看某个语句的执行计划。
    • 存储引擎

      • 到服务器程序完成了查询优化为止,还没有真正地去访问真实的表中数据(在查询优化期间可能访问表中少量数据)。MySQL服务器把数据的存储和提取操作都封装到了一个名为存储引擎的模块中。我们知道,表是由一行一行的记录组成的,但这只是一个逻辑上的概念。在物理上如何表示记录,怎么从表中读取数据,以及怎么把数据写入具体的物理存储器上,都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表可能有不同的存储结构,采用的存取算法也可能不同。
      • 为了方便管理,人们把MySQL服务器处理请求的过程简单地划分为sever层和存储引擎层。连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存取的功能划分为server层的功能,存取真实数据的功能划分为存储引擎层的功能。各种不同的存储引擎为server层提供统一的调用接口,其中包含了几十个不同用途的底层函数,比如“读取索引第一条记录”“读取索引下一条记录”“插入记录”等。
      • 所以在server层完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的接口获取到数据后返回给客户端就好了。不过需要注意的一点是sever层和存储引擎层交互时,一般是以记录为单位的.以SELECT语句为例,sever层根据执行计划先向存储引擎层取一条记录,然后判断是否符合WHERE条件;如果符合,就发送给客户端,否则跳过该记录,然后继续向存储引擎索要下一条记录;依此类推。(server层在判断某条记录符合要求之后,其实是先将其发送到一个缓冲区,待到该缓冲区满了,才向客户端发送真正的记录.该缓冲区大小由系统变量net_buffer_length控制)
  • 常用存储引擎
    - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S0KGT3qe-1644763511871)(../assets/image_1644750189425_0.png)]

    • 我们最常用的就是InnoDB和MyISAM.偶尔还会提一下MEMORY.其中InnoDB是MySQL默认的存储引擎,下面看一下部分存储引擎对于某些功能的支持情况
      - [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bBD2LBM-1644763511871)(../assets/image_1644750249326_0.png)]

    • lnnoDB从MySQL5.5.5版本开始作为MySQL的默认存储引擎,之前版本的默认存储引擎为MyISAM.

  • 存储引擎相关操作

    • 查看当前服务器程序支持的存储引擎

      • SHOW ENGINES;
    • 设置表的存储引擎

      • CREATE TABLE 表名(
               建表语句;
        ) ENGINE = 存储引擎名称;
        
      • CREATE TABLE demo(
               i int
        ) ENGINE = MyISAM;
        
    • 修改表的存储引擎

      • ALTER TABLE demo ENGINE = InnoDB;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值