浅谈Mysql数据库

2023-05-16

一、为什么要使用数据库?

        使用一个东西,就要清楚它的功能价值,才能更好的利用它,使我们在工作生活中游刃有余。关于数据库的使用,好多人会说,一个数据库就是好多张表,那么为什么不使用如Excel的表格呢,作为Mysql的使用者,我们就必须清楚数据库区别于表格的地方,至少要对它有一点了解。

        1、首先,数据库的数据量是没有上限的,但是Excel表格却有。下面一组数据可以说明这个问题:

  •  在2003年之前,一个Excel表格最大行数为65536行
  •  在2007年之后,一个Excel表格的最大行数为1048576行

随着互联网越来越深入到人们生活的方方面面,市场的需求日益扩大,在大部分中大型公司甚至小公司的运营中,他们的业务数据量是千万甚至亿级的,如此庞大的数据信息,用Excel是不合适的,也是不现实的;虽然数据库单库行数过多时,存在性能上的问题,但是我们可以用过分库,分表,分布式,合理的索引等技术手段,来实现数据库的三高(高并发、高性能、高可用)。

        2、数据库具有完备的结构化查询语言,即sql语言,虽然Excel也有查询语言,但是性能却远远无法与sql相比。

3、数据库的服务化:数据库是面向软件的,这要区别于Excel,Excel是文件级别的,面向的始终是终端用户,而数据库只提供软件接口。

        4、支持事务:我们来看看事务的定义:事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。事务是十分重要的,就好比如转账过程:小明和小王账户余额各为1000元,此时小明向小王转账500元,小王的账户应当加500,而小明的账户应当减500,这样子才算完成了转账,事务通过了,大家相安无事,如果中间出了什么问题,小明账户扣了500,但是小王的却没有加,那么就回滚到出现问题之前,两人账户都为1000元,这就是事务的作用,试想没有事务,那么会多出来多少纠纷呢?

        5、支持分布式,分布式是数据库的巨大潜力所在,数据库可以通过主备复制、高可用、分布式等形态,极大地提高性能。

二、软件的典型架构

        分析数据库的典型架构之前,我们先了解一下常见的软件设计架构:

  • 分层架构:这是最广泛也是最常见的架构,通过层(Layer)来隔离不同的关注点(Concern Point),以此应对不同需求的变化,使得这种变化可以独立进行;此外,分层架构模式还是隔离业务复杂度与技术复杂度的利器,常见的三层架构:表现层--->业务层---->数据持久层(与数据库交互),平时我们开发Web应用就会经常用到分层的设计。
  • 事件驱动架构:事件驱动架构模式是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。事件驱动架构模式由高度解耦、单一目的的事件处理组件构成,这些组件负责异步接收和处理事件。如下图:

        通俗的讲:一个事件(Event)进入到事件通道(消息中间件)中,然后消息中间件再根据该事件的属性等特征,将其路由到事件进程中进行处理,然后响应结果给消息中间件,然后根据需要进行二次处理。

  • 管道——过滤器架构:相当于一个事件、数据输入进入一个管道进行filter,多次的过滤处理,达到我们想要的结果,进行输出。如下图:

  •  微核架构:主要依靠插件来实现功能,自己的内核是比较小型的,如IDEA,VScode。如图:

三、Mysql软件架构

        如图:  

        *其中InnoDB、MyISAM、Archive为存储引擎。 

       1、 分析架构:

  • 对于上图的MySQL架构,我们可以看成五层,分别为客户端——>连接器——>server层(缓存、分析器、优化器及执行器)——>存储引擎——>文件系统,这是典型的分层架构;
  • 横看成岭侧成峰,远近高低各不同,我们可以从sql的执行着手分析,这便是一个管道过滤器架构,客户端到连接器再到后面的分析器、优化器、执行器,最后通过存储引擎再到客户端,层层分析优化到执行落盘。
  • 如果我们把连接器到执行器这一部分看做是MySQL的内核,将三种存储引擎当做插件,那么这便是一个微内核架构,存储引擎越多,功能越加强大,即使MySQL没有这些存储引擎,他也是能工作的,有了他们是锦上添花,更加强大丰富。

        2、对此总结:大型的软件并不是单一的架构,如MySQL可以看到分层、管道过滤器(责任链)、微内核等架构的集合。

 四、MySQL四种常见的存储引擎

        1、InnoDB:作为MySQL5.5.5版本之后默认的存储引擎,红的发紫,支持事务、外键、崩溃修复、并发控制等,也为MySQL在市场上的地位的保持提供了强有力的支持。

        2、MyISAM:MySQL5.5.5版本之前默认的存储引擎,插入、查询数据的速度快,性能好,也为它在数据的存储上采用了B+树结构,且不支持事务(功能越少,事情越少,当然也就比较快),而且该引擎的空间利用率较高。

        3、Memory:单词memory内存的意思,顾名思义,该引擎所有的数据都存在内存中,速度很快(不论是查询还是插入),但是数据安全性低,因为都在内存中,一旦设备断电损坏等,容易造成数据的丢失,从而造成不可估量的损失,所以在使用存储引擎时要评估风险,因业务性质制宜。

        4、Archive:数据压缩放进磁盘,空间利用率高,但不支持索引,这也导致了它插入数据快,取出数据慢,查询性能差。一般我们用它存放一些日志信息等不经常查询的数据。

五、客户端是如何连接MySQL数据库的

        1、常见的连接方式有很多种,这里举例四种:

  • TCP/IP连接:MySQL在任何平台都提供的连接方式。
  • 命名管道:Windows系统特有的连接方式,需要在同一台服务器才能进行通讯,开启方式为:--enable-named-pipe。
  • 共享内存:开启方式:                                      

             服务端:--shared-memory

             客户端:--protocol=memory

  • UNIX域套接字:开启方式:                                    

             客户端:-S=/tem/mysql.sock

             服务端:--socket=/tem/mysql.sock

        2、MySQL的TCP讯通协议基本过程:

         *过程分析:

  • 认证连接:服务端向客户端发送握手初始化包——>客户端向服务端发送验证——>服务端向客户端发送认证结果消息。这个过程为什么是服务端先发送数据包呢?就好比如我们去饭店吃饭,服务员会先开口欢迎并询问吃什么,几个人一样,再由我们顾客来回答。
  • 命令执行:客户端向服务端发送命令包(Command Packet)——>服务端向客户端发送回应包。
  • 断开连接:客户端向服务器发送退出命令包

        3、MySQL TCP报文格式:

  •  消息头(header):三字节报文长度,一字节为序列号。
  • 消息体(body):一字节为指令其余为参数,即数据,例如切换数据库的指令为0X02、查询命令指令为0X03。
  • 推荐抓包工具:wireshark网络分析器。

六、一条sql是如何执行的(步骤及其功能作用)?

  1.   连接器:监听客户端请求,然后将请求指令转发给缓存(查询缓存)
  2. 查询缓存:缓存是指之前执行过的语句以K-V键值对的形式存在内存中;数据表被删除后,会删除所有相关的缓存;所有在MySQL8.0之后,缓存功能由于性能的浪费被删除了。
  3. 分析器:先做词法分析,分析该语句关键字(如SELECT、DELETE、JOIN、UPDATE等),再做句法分析,判断sql是否符合语法。
  4. 优化器:主要工作为决定如何使用索引。
  5. 执行器:主要工作为校验权限,以行作为粒度调用存储引擎;校验权限是校验此用户对目标数据是否有访问操作的权限;在没有索引时,执行器会循环查询所有行(索引对于性能的提高很重要)
  6. 存储引擎(这里以InnoDB为例):将指令落实在数据文件上。

完毕!谢谢耐心观看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈Mysql数据库 的相关文章

  • 有什么办法可以自动生成UML图吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 MySQL 数据库 我想生成它的关系图 有没有一个工具可以连接到数据库并自动为我生成它 是的
  • MySQL Amazon RDS:超出锁定等待超时

    在 Mysql Amazon RDS 上 当我尝试运行以下 SQL 查询时 UPDATE table1 INNER JOIN table2 USING CommonColumn SET table1 col1 table2 x table1
  • 在Spring-Boot中,我们如何在同一个项目中连接两个数据库(Mysql数据库和MongoDB)?

    我正在尝试创建一个 Spring Boot 项目 其中我有一个要求 我想连接到不同的数据库 MySql 和 MongoDB 我是否需要做一些特殊的事情来连接到这两个数据库 或者 spring boot 会自动计算出自己连接到这两个数据库 我
  • 如何只允许从我的 iOS 应用程序访问我的 MySQL 数据库? (使用webapp作为数据库的网关)

    我的 iOS 应用程序需要连接到 mysql 服务器 为了实现这一目标 我想创建一个 Web 应用程序 充当客户端应用程序和服务器端数据库之间的中间人 我担心的是 有人可以简单地找出我的应用程序使用的 URL 并传递他们自己的 URL 参数
  • 使用整数数组设置外键

    我对使用 SQL 还很陌生 但我在 Stack Overflow 上遇到过这个关于使用标签的问题 推荐用于标记或标记的 SQL 数据库设计 https stackoverflow com questions 20856 recommende
  • MySQL - 使用可变路径加载数据文件

    我在设置用于将数据放入表中的变量路径时遇到问题 这就是我构建路径的方式 SET path1 CONCAT C Projekte Metrics DXL CSV EXPORT DATA YEAR NOW MONTH NOW DAY NOW B
  • 通过 PHP 将 CSV 导入 MYSQL

    我正在将 CSV 文件导入到我的管理区域 并且我想将文件添加到我的数据库中 我的 PHP 代码import php is
  • MySQL 匹配全文

    我正在尝试使用 mysql 进行全文搜索以匹配字符串 问题是它首先返回奇怪的结果 例如 字符串 passat 2 0 tdi AND MATCH records veiculos titulo records veiculos descri
  • Mysql启动问题|错误!服务器退出而不更新PID文件

    有任何想法吗 Joshs MacBook Pro cdwhp joshc mysql server start Starting MySQL ERROR The server quit without updating PID file u
  • 检查字段是否为空

    如果我想检查该字段是否有除 null 和空之外的其他字符 查询是否正确 select CASE WHEN description IS NULL THEN null WHEN description IS NOT NULL THEN not
  • 查找至少有 2 名员工的部门

    我需要做sql问题将显示至少有 2 人的所有部门 SELECT department name FROM department INNER JOIN employee ON department id employee department
  • 如何将 PHP 数组中的值插入到 MySQL 表中?

    我正在创建一个注册表单 其中包含姓名 电子邮件和电话号码字段 为了检查用户输入的有效性 我有一个函数validate input 返回一个数组 arr包含用户输入的输入 如果用户输入有效 arr然后传递给一个单独的函数 该函数将值插入arr
  • 设置 MySQL 触发器

    我听说过有关触发器的事情 我有几个问题 什么是触发器 我该如何设置它们 除了典型的 SQL 内容之外 是否还应该采取任何预防措施 触发器允许您在发生某些事件 例如 插入表 时在数据库中执行某个功能 我无法具体评论mysql 注意事项 触发器
  • 如何在 mySQL 中定义自定义 ORDER BY 顺序

    在 MySQL 中如何定义自定义排序顺序 为了尝试解释我想要的内容 请考虑这张表 ID Language Text 0 ENU a 0 JPN b 0 DAN c 1 ENU d 1 JPN e 1 DAN f 2 etc 在这里 我想返回
  • Laravel 5:如何检索并显示属于特定类别的所有帖子

    我有3张桌子 user id username subreddits id name created at posts id title link user id subreddit id 问题是 我手动获取 subreddit 类别的 i
  • 将 Null 与 MySQL 触发器中的另一个值进行比较

    所以这是我的问题 我在更新表行时比较新值和旧值 但新值或旧值有时会为空 所以下面的代码不起作用 我可以解决这个问题吗 谢谢 BEFORE UPDATE ON mytable FOR EACH ROW BEGIN IF OLD assigne
  • 跨数据库管理系统检查字符串是否为数字的方法

    好的 我有这个字段 code varchar 255 它包含我们导出例程中使用的一些值 例如 DB84 DB34 3567 3568 我需要仅选择自动生成的 全数字 字段 WHERE is numeric table code is num
  • MySQL中的字符串分割函数

    谁能告诉我如何在 mysql 中实现 split 函数 其行为类似于 Javascript split 我想要一个这样的功能 SELECT Split a b c d AS splitted 结果如下 splitted a b c d 有谁
  • 创建索引可以使用现有索引吗?

    我在 A B 和 C 列上有单独的索引 我想在 A B C 三列上创建一个复合索引 我的会有什么影响existing指数对综合指数creation 数据库会利用它们吗 它们是否无关紧要 或者它们会减慢我的新复合索引的创建速度吗 我正在使用
  • MYSQL sum() 计算不同的行

    我正在寻求在 SQL 查询中使用 sum 的帮助 SELECT links id count DISTINCT stats id as clicks count DISTINCT conversions id as conversions

随机推荐