作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里给出开源框架的地址:https://github.com/sunshinelyz/mykit-delay上面写着很多小伙伴工作了很久,但是对MySQL的掌握只是粗浅的CRUD,对MySQL深入的原理和技术知识了解甚少。随着工作年限的不断增加,职场的竞争力也在不断降低。很多时候,外出面试,被面试官吊打,已经成为家常便饭。比如MySQL的高频面试题有:说说MySQL中MVCC机制的原理?MySQL的事务原理及实现?MySQL数据主从复制的原理?MySQL底层数据的存储结构?MySQL中锁机制的原理与实现?MySQL索引机制?索引涉及的数据结构和算法?为什么MySQL使用B+树作为索引结构?B+树能存储多少数据?说说MySQL中间隙锁的实现原理?InnoDB引擎为什么会崩溃?说说它的实现原理?等等一系列其他的高频面试。如果一一列举,大概可以列出几百道关于MySQL的高频面试题。如果你想从一个低级程序员上升到高级工程师、架构师等,你必须掌握MySQL的底层原理和技术。注:冰川会不定时连载MySQL底层原理和技术文章。和小伙伴们一起砸MySQL,把Glacier掌握的MySQL底层技术分享给大家,在面试中打败面试官,在工作中打败别人。伙伴。文章已被收录:https://github.com/sunshinelyz/technology-binghehttps://gitee.com/binghe001/technology-bingheMySQL架构先来看一下MySQL的架构图,如下图。注:图片来源于网络。从MySQL的架构图中我们可以看出,MySQL的架构从上到下大致可以分为网络连接层、数据库服务层、存储引擎层和系统文件层四个部分。下面简单说一下各部分的组成信息。网络连接层网络连接层位于整个MySQL架构的最顶层,主要作为客??户端连接器。提供与MySQL服务器建立连接的能力,支持几乎所有主流的服务器端语言,如Java、C、C++、Python等,每种语言都通过自己的API接口与MySQL建立连接。数据库服务层数据库服务层是整个数据库服务器的核心,主要包括系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存。连接池主要负责存储和管理客户端与数据库的连接信息,连接池中的一个线程负责管理客户端与数据库的连接信息。系统管控工具提供数据库系统的管理和控制功能,如备份和恢复数据库中的数据,保证整个数据库的安全,提供安全管理,协调和管理整个数据库的集群等。SQL接口主要负责接收客户端发送的各种SQL命令,将SQL命令发送给其他部分,接收其他部分返回的结果数据,并将结果数据返回给客户端。解析树主要负责将请求的SQL解析成“解析树”,然后根据MySQL中的一些规则进一步对“解析树”进行语法校验,确认是否合法。查询优化器在MySQL中,如果“解析树”通过了解析器的语法检查,此时会被优化器转化为执行计划,然后与存储引擎进行交互,存储引擎通过它与查询器进行通信。底层数据文件。相互影响。缓存MySQL的缓存是由一系列的小缓存组成的。例如:MySQL表缓存、记录缓存、MySQL中的权限缓存、引擎缓存等。MySQL中的缓存可以提高数据的查询性能。如果查询结果能够命中缓存,MySQL会直接返回缓存中的结果信息。存储引擎层MySQL中的存储引擎层主要负责数据的写入和读取,以及与底层文件的交互。值得一提的是,MySQL中的存储引擎是插件式的,服务器中的查询执行引擎通过相关接口与存储引擎进行通信。同时,接口屏蔽了不同存储引擎之间的差异。在MySQL中,最常用的存储引擎是InnoDB和MyISAM。InnoDB和MyISAM存储引擎是小伙伴需要掌握的,高频面试考点也是一个架构师必须知道的内容。系统文件层系统文件层主要包括MySQL中存储数据的底层文件,与上层存储引擎交互,是文件的物理存储层。存储的文件主要包括:日志文件、数据文件、配置文件、MySQLpid文件和??socket文件等日志文件MySQL中的日志主要包括:错误日志、一般查询日志、二进制日志、慢查询日志等。errorlog主要存放MySQL运行过程中产生的错误信息。可以使用如下SQL语句查看MySQL中的错误日志。显示像“%log_error%”这样的变量;通用查询日志主要记录MySQL运行过程中的通用查询信息,可以使用如下SQL语句查看MySQL中的通用查询日志文件。showvariableslike'%general%';二进制日志主要记录对MySQL数据库进行的insert、modify、delete操作,同时也记录SQL语句的执行时间和持续时间,但是binarylog不记录不修改的select、show等数据库SQL。主要用于恢复数据库数据,实现MySQL主从复制。检查二进制日志是否开启。showvariableslike'%log_bin%';查看二进制日志参数showvariableslike'%binlog%'查看日志文件showbinarylogs;慢查询日志慢查询主要记录执行时间超过指定时间的SQL语句,默认时间为10秒。检查慢查询日志是否开启showvariableslike'%slow_query%';查看慢查询设置的持续时间showvariableslike'%long_query_time%'数据文件数据文件主要包括:db.opt文件、frm文件、MYD文件、MYI文件、ibd文件、ibdata文件、ibdata1文件、ib_logfile0和ib_logfile1文件,etc.db.opt文件主要记录了当前数据库使用的字符集、检查规则等信息。frm文件存放数据表的结构信息,主要是数据表相关的元数据信息,包括数据表的表结构定义信息,每张表都会有一个frm文件。值得注意的是,MySQL8版本的innodb存储引擎的表是没有frm文件的。(后面会写一些MySQL8的新特性的文章,从使用到底层原理,跟MySQL5有什么不同)。MYD文件是MyISAM存储引擎的一种特殊文件格式,主要存储MyISAM存储引擎数据表中的数据。每个MyISAM存储引擎表对应一个.MYD文件。MYI文件是MyISAM存储引擎的一种特殊文件格式,主要存储与MyISAM存储引擎的数据表相关的索引信息。每个MyISAM存储引擎表对应一个.MYI文件。ibd文件存放的是Innodb存储引擎的数据文件和索引文件。主要存放专属表空间的数据和索引,每个表对应一个.ibd文件。ibdata文件存放的是Innodb存储引擎的数据文件和索引文件。主要存放共享表空间的数据和索引。所有表共享一个(或多个).ibdata文件,可根据配置指定共享.ibdata文件的个数。.ibdata1文件是MySQL系统表空间数据文件,主要存放MySQL数据表元数据、Undo日志等信息。ib_logfile0和ib_logfile1文件是MySQL数据库中的Redo日志文件,主要用于MySQL实现事务持久化。如果MySQL在某个时间点发生故障,如果有脏页还没有写入数据库的ibd文件,当重启MySQL时,MySQL会根据RedoLog信息重做,会写入RedoLog并有尚未将写入数据表的数据持久化。配置文件用于存放MySQL的所有配置信息。在Unix/Linux环境下为my.cnf文件,在Windows环境下为my.ini文件。pid文件pid文件是存储MySQL进程运行时的进程号的文件。它主要存在于Unix/Linux环境中。具体存放目录可以在my.cnf或my.ini文件中配置。socket文件socket文件和pid文件一样,是MySQL运行在Unix/Linux环境下才有的文件。在Unix/Linux环境下,客户端可以直接通过socket连接MySQL。本文转载自微信公众号“冰河科技”,可通过以下二维码关注。转载本文请联系冰川科技公众号。
