MySQL服务与存储引擎间的接口

MySQL 存储引擎与服务体系深度解析 存储引擎:MySQL服务的核心组件,负责数据的存储、检索和管理版本演进MySQL 5.0/5.1 默认使用MyISAM引擎MySQL 5.5/5.6+ 默认采用InnoDB引擎。 阅读详情
MySQL定义了一系列抽象存储引擎API,以支持插件式存储引擎架构。在历史版本中,这些接口被为"table handler"。我们这里所说的存储引擎(Storage Engine),是指数据的存储/读取相关的逻辑模块。而存储引擎API(table handler)是指Storage Engine与MySQL优化器间的接口。比如,新增一个存储引擎---Storage Engine,如何实现MySQL服务层对存储存储引擎访问呢?MySQL服务访问的存储引擎是接口就是抽象存储引擎API,新存储引擎只需要实现相应的抽象存储引擎API接口,就可以实现MySQL Service对存储引擎的访问。
MySQL插件式存储引擎架构,促使MySQL以更加开放的姿态,接受更多的存储引擎。抽象存储引擎接口是在v3.22提升到v3.23时引入的设计。在快速集成InnoDB存储引擎阶段中起了很大的作用。众所周知,InnoDB为MySQL带来了稳定事务支持、多版本、行锁。只要知道怎么读写记录,任何东西都可以很快的集成到MySQL中。

抽象存储引擎API接口是通过抽象类handler来实现,handler类提供诸如打开/关闭table、扫表、查询Key数据、写记录、删除记录等基础操作方法。每一个存储引擎通过继承handler类,实现以上提到的方法,在方法里面实现对底层存储引擎的读写接口的转调。从5.0版本开始,为了避免在初始化、事务提交、保存事务点、回滚操作时需要操作one-table实例,引入了handlerton结构让存储引擎提供了发生上面提到操作时的钩子操作。


API以Handler类的虚函数的方式存在,可在代码库下的./sql/handler.h中查看详细信息。可在Handler类的注释中看到描述:

/**
  The handler class is the interface for dynamically loadable storage engines. Do not add ifdefs and take care when adding or changing virtual functions to avoid vtable confusion Functions in this class accept and return table columns data. Two data representation formats are used: 1. TableRecordFormat - Used to pass [partial] table records to/from storage engine 2. KeyTupleFormat - used to pass index search tuples (aka "keys") to storage engine. See opt_range.cc for description of this format. TableRecordFormat ================= [Warning: this description is work in progress and may be incomplete] The table record is stored in a fixed-size buffer: record: null_bytes, column1_data, column2_data, ... //篇幅原因,略去部分内容。 */ class handler : public Sql_alloc { //篇幅原因,不列出具体代码。读者可直接在源码文件./sql/handler.h中找到具体内容。 }


Handler类继承自Sql_alloc类,Sql_alloc没有任何成员变量,纯粹重载了new和delete操作。所以Handler类分配内存是可以从连接相关的内存池来分配。而delete操作时不做任何事情。内存的释放只会在mysys/my_alloc.c的free_root()调用发生。无需显式释放,在语句执行之后清理。

每一个table描述符对应一个handler的实例。注意针对同一个table可能会被打开多次的情况,这时候会出现多个handler实例。5.0版本引入index_merge方法后导致了一些有趣的方式,以前多个handler实例只会在table cache中拷贝描述符产生,引入Index_merge之后,handler实例可能会在优化阶段被创建。

下面我将分类描述部分存储引擎API。
创建、打开和关闭表:

通过函数create来创建一个table:
/**
  *name:要创建的表的名字
  *from:一个TABLE类型的结构,要创建的表的定义,跟MySQL Server已经创建好的tablename.frm文件内容是匹配的
  *info:一个HA_CREATE_INFO类型的结构,包含了客户端输入的CREATE TABLE语句的信息
*/

int create(const char *name, TABLE *form, HA_CREATE_INFO *info);


通过函数open来打开一个table:
/**
  mode包含以下两种
  O_RDONLY  -  Open read only
  O_RDWR    -  Open read/write
*/

int open(const char *name, int mode, int test_if_locked);


通过函数close来关闭一个table:
int close(void);


对表加锁:
当客户端调用LOCK TABLE时,通过external_lock函数加锁:
int ha_example::external_lock(THD *thd, int lock_type)

全表扫描:
//初始化全表扫描
virtual int rnd_init (bool scan);
//从表中读取下一行
virtual int rnd_next (byte* buf);


通过索引访问table内容
//使用索引前调用该方法
int ha_foo::index_init(uint keynr, bool sorted) 
//使用索引后调用该方法
int ha_foo::index_end(uint keynr, bool sorted)
//读取索引第一条内容
int ha_index_first(uchar * buf);
//读取索引下一条内容
int ha_index_next(uchar * buf);
//读取索引前一条内容
int ha_index_prev(uchar * buf);
//读取索引最后一条内容
int ha_index_last(uchar * buf);
//给定一个key基于索引读取内容
int index_read(uchar * buf, const uchar * key, uint key_len,
          enum ha_rkey_function find_flag)

事务处理
//开始一个事务
int my_handler::start_stmt(THD *thd, thr_lock_type lock_type)
//回滚一个事务
int (*rollback)(THD *thd, bool all); 
//提交一个事务
int (*commit)(THD *thd, bool all);


handlerton 4.1之前的版本,从handler类继承是唯一一个存储引擎可以与核心结构交互的途径。
当优化器需要针对存储引擎做一些事情的时候,只可能调用当前table相关的handler实例的接口方法。但是随着集成多种存储引擎的发展,尽是靠handler方法来交互的形式是不太够的,因此,handlerton概念诞生。

handlerton是一个几乎全是回调方法指针的C结构体。定义在sql/handler.h
回调函数在某一事件发生时针对具体的存储引擎被调用(事务提交/保存事务点/连接关闭等)

如何编写自己的存储引擎

在MySQL的官方文档上,有对于编写自己的存储引擎的指导文档,链接如下。
作为编写自己存储引擎的开始,你可以查看MySQL源码库中的一个EXAMPLE存储引擎,它实现了必须要实现的存储引擎API,可以通过复制它们作为编写我们自己存储引擎的开始:

sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.h > ha_foo.h
sed -e s/EXAMPLE/FOO/g -e s/example/foo/g ha_example.cc > ha_foo.cc


如何添加第三方存储引擎

5.1之后版本添加变得简单多。可以根据"blackhole"存储引擎的模式来改造
1、创建目录 storage/xx-csv,实际文件ha_csv.h(cc)移至该目录
2、Makefile.am 放入storage/xx-csv
3、configure.in 改写MYSQL_STORAGE_ENGINE宏
4、autoconf & automake & ./configure --prefix=/usr --with-plugins=xx-csv & make

mysql_declare_plugin宏注册引擎

读写支持的存储引擎需要面对更多问题,多个handler实例会被创建,发现多个写实例的存在会导致写入位置发生一些奇怪的现象,这或许会让我们感到惊讶。其他存储引擎通过共享底层的表描述符结构体来解决这个问题。

sql/examples/ha_tina.cc更为详细的引擎实现方式
MySQL之服务器配置:InnoDB存储引擎与内存优化策略 在MySQL的学习与实践中,服务器配置是影响其性能与稳定性的关键因素,而InnoDB存储引擎的配置又是其中的重中之重。在探索这部分知识的过程中,我积累了不少经验,也遇到过一些问题,今天就想和大家分享一下,希望能和大家一起学习进步,更深入地掌握MySQL服务器配置的要点。 阅读详情

相关推荐

「MySQL高级篇」MySQL存储引擎

特点InnoDBMyISAMMEMORY存储限制64TB有有事务安全支持--锁机制行锁表锁表锁B+tree索引支持支持支持Hash索引--支持全文索引支持(5.6以后)支持-空间使用高低N/A内存使用高低中等批量插入速度低高高支持外键支持--

Trouvailless的博客 1680

Mysql官方接口中文解释

主要是对官方接口说明进行翻译(机翻),其实看英文的说明也差不多。 本人做了一定的区分以及整合,主要还是为了方面查找和阅读 一:初始化 设置和关闭服务器;为了确保应用程序在针对标准客户端库或嵌入式服务器库进行链接时能够正常工作,应该调用这些函数。 Mysql_server_init /end需要在使用libmysqld或libmysqlclient时调用(确切地说,Mysql_server_init()是由mysql_init()调用的,所以你不需要显式调用它;但是您需要调...

初音骑士的博客 4325

【MySQL进阶教程】 存储引擎详细介绍_mysql 存储引擎详解

大家可能没有听说过存储引擎,但是一定听过引擎这个词,引擎就是发动机,是一个机器的核心组件。比如,对于舰载机、直升机、火箭来说,他们都有各自的引擎,是他们最为核心的组件。而我们在选择引擎的时候,需要在合适的场景,选择合适的存储引擎,就像在直升机上,我们不能选择舰载机的引擎一样。而对于存储引擎,也是一样,他是mysql数据库的核心,我们也需要在合适的场景选择合适的存储引擎。接下来就来介绍一下存储引擎。存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。

2301_79098686的博客 528

数据库-mysql架构与sql执行原理(上)(一)

mysql的架构设计以及sql执行原理剖析

平凡之路无尽路的博客 665

WSL2+Docker实战:在Windows上部署MinerU 2.5.3,解锁媲美Demo的VLM PDF解析能力

本文详细介绍了如何在Windows系统上通过WSL2+Docker部署MinerU 2.5.3,实现媲美Demo的VLM PDF解析能力。文章涵盖环境准备、Docker部署实战技巧及高级使用技巧,特别针对PDF识别中的复杂排版、公式和图表处理提供了优化方案,帮助用户高效处理学术论文和技术文档。

weixin_29291573的博客 482

微机原理课程设计-模拟十字路口交通信号灯

一、设计任务描述 1.1设计目的 通过课程设计使学生更进一步掌握微机原理及应用课程的有关知识,提高应用微机解决问题的能力,加深对微机应用的理解。通过查阅资料,结合所学知识进行软、硬件的设计,使学生初步掌握应用微机解决问题的步骤及方法。为以后学生结合专业从事微机应用设计奠定基础。 1.2 设计要求 控制LED灯,按照十字路口红绿灯的原理亮灭显示: (1) 东西方向车辆放行x秒...

Learning_is_endless的博客 2万+

MySQL高级知识点 | 一、逻辑架构与存储引擎

逻辑架构与存储引擎 Mysql逻辑架构介绍 mysql 数据库的逻辑架构如下图 mysql 的逻辑的逻辑架构大体分为四层:连接层、服务层、引擎层、存储层。下面我们就来一一介绍这四层。 连接层 最上层是一些客户端和连接服务,包含本地socket通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通...

sc的博客 430

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1053

MySQL - 一文了解MySQL的基础架构及各个组件的作用

MySQL可以基本划分为Server层和存储引擎层两部分:Server层包含了MySQL大多数核心功能,除了图中标注的连接器,查询缓存,分析器,优化器,执行器,还有所有的内置函数(日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现,如存储过程、触发器、视图等。存储引擎层负责MySQL中数据的存储和提取。和Linux下的各种文件系统一样,每个存储引擎都有自己的优势和劣势,各种存储引擎通过提供API和Server层对接,通过API屏蔽各种存储引擎之间的差异。常见的存储引擎有InnoDB、MyISA

迪曼奥特迦-博客 2275

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5987

USB3.0 Type-B连接器SSTX/SSRX信号定义常见错误与硬件设计避坑指南

本文详细解析了USB3.0 Type-B连接器中SSTX/SSRX信号的定义标准与常见设计错误。针对连接器厂商图纸可能出现的信号标识错误,提供了实用的排查方法和硬件设计避坑指南,帮助工程师避免因引脚定义颠倒导致的通信降级或故障,确保USB3.0高速传输的稳定性。

gg901的博客 1269

[MySQL]MySQL学习笔记

目录 关系型数据库和非关系型数据库 MySQL逻辑架构 MySQL存储引擎 MySQL索引 索引结构(索引需要存储哪些信息): InnoDB 索引结构: B+树: MyISAM的索引 InnoDB的索引 聚集索引(主键索引) 非聚集索引 SQL:Structured Query Language,意为结构化查询语言,是访问数据库的最常见的标准化语言。 关系型数据库和非关系型数据库 一、关系型数据库特点: 关系型数据库以表格的形式存在,基于行来存储数据,是一个二维模式。 关系型

A_tina的博客 856

Docker “docker login“ 失败? 登录阿里云镜像仓库仓库 unauthorized: authentication required

文章目录听说你 login fail?来,让我们解决一下!登录,撒花 听说你 login fail? 美滋滋的在服务器上安装完成Docker应用,开始配置阿里云镜像加速?然后被阿里云官方文档蹂躏?别急别急,让我来拯救你。 我们先来看看 阿里云官方文档 Docker镜像基本操作: 好家伙,emmm… 上来直接就Login Succeeded,这不简直so easy?我们也来照着操作操作: docker@default-online:~$ docker login registry.cn-hangzhou.a

zhuzicc的博客 1万+

MySQL存储引擎接口

MySQL提供了访问不同的存储引擎数据表的虚拟层API。过去,这些接口被称之为"table handler".现在有了新的介绍——storage engine.目前我们所提到的storage engine,往往是与存储/读取数据的相关代码,而table handler指的是storage engine与MySQL优化器的接口. 抽象接口极大地促进MySQL加入其它存储引擎的步伐,抽象接口

Chappell的专栏 2913

静态代码审计插件 snyk 使用教程

静态代码审计插件 snyk 使用教程

SHELLCODE_8BIT的博客 2005

[Dify实战] OA 公文排版助手:自动格式化、编号、生成摘要-带配套资源

摘要: Dify 公文排版助手通过自动化解决公文处理中的格式混乱、编号错漏等问题。支持标题层级自动编号、摘要生成、要素补全等功能,输出标准化Markdown格式。核心流程包括输入原文、智能识别、自动排版与要素输出,适用于通知、纪要等场景。实施需统一模板规则,规范输入格式,并通过试跑优化纠错率与处理效率。关键价值在于减少人工返工,提升排版一致性,未来可对接OA系统实现全流程自动化。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 474

mysql跨服务查询之FEDERATED存储引擎

文章目录一、FEDERATED存储引擎1.1、说明:1.2、局限性1.3、跨服务的方式二、开启FEDERATED存储引擎1.1、查看存储引擎1.1.1、不存在存储引擎-安装1.2、开启存储引擎1.3、拓展mysql存储引擎对比三、跨服务连接示例1.1、 目标:1.2、创建关系1.2.1、权限说明1.3、成功效果1.4、增删改查 一、FEDERATED存储引擎 01、从5.1.26开始,默认MySQL不启用federated存储引擎,所以需要在my.cnf中加入federated选项 02、或是在命令行用

suqinyi的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MySQL 存储引擎

MySQL 存储引擎

weixin_68840588的博客 1567

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

mysql架构与存储引擎

文章目录一、MySQL体系架构1.1 网络连接层1.2 服务层(MySQL Server)1.3 存储引擎层(Pluggable Storage Engines)1.4 系统文件层(File System)1.4.1 日志文件1.4.2 配置文件1.4.3 数据文件1.4.4 pid 文件1.4.5 socket 文件二、存储引擎2.1 MyISAM 存储引擎2.2 InnoDB 引擎2.3 其他存储引擎2.4 管理存储引擎三、 MySQL 中的系统数据库 一、MySQL体系架构 MySQL Server架

人丑就要多读书的博客 2657

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

MySQL存储引擎

MySQL存储引擎 一、存储引擎概念介绍二、MySQL常用的存储引擎1、MyISAM1.1 MyISAM的特点1.2 MyISAM 表支持 3 种不同的存储格式1.3 MyISAM适用的生产场景 2、InnoDB2.1 InnoDB特点 三、查看系统支持的存储引擎四、查看表使用的存储引擎五、修改存储引擎 一、存储引擎概念介绍 MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能..

Smile x 6112

MySQL 体系结构与存储引擎

通过深入理解MySQL体系结构和存储引擎特性,可以针对不同业务场景做出最优的数据库设计和配置选择,从而获得最佳的性能和可靠性。协议支持:TCP/IP、Unix Socket、Named Pipe。:高并发写选择InnoDB,读多写少考虑MyISAM。文件:表空间文件(每个表单独文件):系统表空间、独立表空间、通用表空间。:如MySQL 8.0的哈希索引优化。使用非聚集索引(索引和数据分离):回滚日志(存储在系统表空间):接收SQL语句,返回结果。:SQL解析器,生成解析树。:查询优化器,生成执行计划。

m0_70296476的博客 1142

【MySQL 高阶】MySQL 架构与存储引擎全面详解

MySQL采用分层模块化架构,分为连接层、服务层、存储引擎层和文件系统层。连接层处理客户端连接管理;服务层负责SQL解析、优化和执行;存储引擎层支持可插拔引擎如InnoDB(默认,支持事务)、MyISAM(读性能优)、MEMORY(内存表)等;文件系统层负责数据持久化。核心特点是服务与存储分离,允许按业务需求选择不同存储引擎,其中InnoDB适合事务型应用,MyISAM适用于读密集型场景,ARCHIVE适合数据归档。该设计提供了高度灵活性和性能优化空间。

2301_79816047的博客 1603

MySQL - 体系结构与存储引擎

MySQL - 体系结构与存储引擎

weixin_46619605的博客 1351
上一篇: 关于typedef的用法总结
下一篇: 主键和唯一索引的区别
itopcat
博客等级 码龄14年 7粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值