首页 » Web前端 » php沙漏技巧_MySQL高级篇MySQL逻辑架构存储引擎

php沙漏技巧_MySQL高级篇MySQL逻辑架构存储引擎

duote123 2024-11-17 0

扫一扫用手机浏览

文章目录 [+]

这篇将从如下几点,带你攻破逻辑架构和存储引擎:

逻辑架构层次不同的存储引擎InnoDB和MyISAM的差异其他存储引擎存储引擎的选择原则逻辑架构

php沙漏技巧_MySQL高级篇MySQL逻辑架构存储引擎

可以类比我们的MVC架构

php沙漏技巧_MySQL高级篇MySQL逻辑架构存储引擎
(图片来自网络侵删)
首先是连接层,对外展示,让外界可以通过一定技能连接到我们mysql,如jdbc,.NET,PHP等之后便是一全体Server做事层,里边有很多个模块Connection Pool : 连接池组件Management Services & Utilities : 管理做事和工具组件SQL interface,来分辨出是DML还是DDL,view,trigger等Parser 解析器,解析客户端发起的要求,去掉注释?像一个沙漏一样Optimizer 优化器Caches & Buffers 缓存引擎层Pluggable Storage Engines 可插拔存储引擎,可以随时改换存储层File System : 文件系统(实质上操作的都是文件)

1) 连接层 最上层是一些客户端和链接手事,包含本地sock 通信和大多数基于客户端/做事端工具实现的类似于 TCP/IP的通信。
紧张完成一些类似于连接处理、授权认证、及干系的安全方案。
在该层上引入了线程池的观点,为通过认证安全接入的客户端供应线程。
同样在该层上可以实现基于SSL的安全链接。
做事器也会为安全接入的每个客户端验证它所具有的操作权限。

2) 做事层 第二层架构紧张完成大多数的核心做事功能,如SQL接口,并完成缓存的查询,SQL的剖析和优化,部分内置函数的实行。
所有跨存储引擎的功能也在这一层实现,如 过程、函数等。
在该层,做事器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定表的查询的顺序,是否利用索引等, 末了天生相应的实行操作。
如果是select语句,做事器还会查询内部的缓存,如果缓存空间足够大,这样在办理大量读操作的环境中能够很好的提升系统的性能。

3) 引擎层 存储引擎层, 存储引擎真正的卖力了MySQL中数据的存储和提取,做事器通过API和存储引擎进行通信。
不同的存储引擎具有不同的功能,这样我们可以根据自己的须要,来选取得当的存储引擎。

4)存储层 数据存储层, 紧张是将数据存储在文件系统之上,并完成与存储引擎的交互。

和其他数据库比较,MySQL有点分歧凡响,它的架构可以在多种不同场景中运用并发挥良好浸染。
紧张表示在存储引擎上,插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取分离。
这种架构可以根据业务的需求和实际须要选择得当的存储引擎。

热插拔此处的插拔式可以理解为热插拔喔,便是可以在一直掉系统的情形下,随时改换引擎,而不影响原来的系统。

机器键盘玩家表示老在行了,热插拔键盘yyds

比拟一下,这是传统的电焊式(非热插拔):

这是热插拔:

图源:www.zhihu.com/question/40…

存储引擎概述

和大多数的数据库不同,MySQL中有一个存储引擎的观点,针对不同的存储需求可以选择最优的存储引擎。

存储引擎便是存储数据,建立索引,更新查询数据等等技能的实现办法 。
存储引擎是基于表的,而不是基于库的。
以是存储引擎也可被称为表类型。

Oracle,SqlServer等数据库只有一种存储引擎。
MySQL供应了插件式的存储引擎架构。
以是MySQL存在多种存储引擎,可以根据须要利用相应引擎,或者编写存储引擎。

MySQL5.0支持的存储引擎包含 : InnoDB 、MyISAM 、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,个中InnoDB和BDB供应事务安全表,其他存储引擎是非事务安全表。

重点存储引擎是基于表的,而不是基于库!



热插拔:我们可以在不重启MySQL的情形下,随时改换引擎,而不影响原来的系统。
每个表也可以选择不同的存储引擎,虽然每每不建议这么做。
查看支持的引擎

show engines;

​查询当前数据库支持的存储引擎

Engine:存储引擎名称。
Support:是否支持该引擎以及该引擎是否为默认存储引擎,YES表示支持,NO表示不支持,DEFAULT表示为默认存储引擎。
Comment:存储引擎的大略先容。
Transactions:表示该引擎是否支持事务。
XA:解释该存储引擎是否支持分布式事务。
Savepoints:解释该存储引擎是否支持部分事务回滚。

创建新表时如果不指定存储引擎,那么系统就会利用默认的存储引擎,MySQL5.5之前的默认存储引擎是MyISAM,5.5之后就改为了InnoDB,这俩有什么差异,为什么MyISAM变为了InnoDB,下文我们会商及到这一点,也是口试时常常会问到的点

干系命令

-- 查看支持的存储引擎SHOW ENGINES-- 查看默认存储引擎SHOW VARIABLES LIKE 'storage_engine'--查看详细某一个表所利用的存储引擎,show create table tablename--准确查看某个数据库中的某一表所利用的存储引擎show table status like 'tablename'show table status from database where name="tablename"设置存储引擎

-- 建表时指定存储引擎。
默认的便是INNODB,不须要设置CREATE TABLE t1 (i INT) ENGINE = INNODB;CREATE TABLE t2 (i INT) ENGINE = MEMORY;-- 修正存储引擎ALTER TABLE t ENGINE = InnoDB;-- 修正默认存储引擎,或者在配置文件my.cnf中修正默认引擎SET default_storage_engine=NDBCLUSTER;
查看默认存储引擎

show variables like '%storage_engine%' ;

各种存储引擎特性

最常利用的两种存储引擎: InnoDB、MyISAM ;

特点

INNODB

MYISAM

MEMORY

MERGE

NDB

存储限定

64TB

没有

事务安全

支持

锁机制

行锁(适宜高并发)

表锁

表锁

表锁

行锁

B树索引

支持

支持

支持

支持

支持

哈希索引

支持

全文索引

支持(5.6版本之后)

支持

集群索引

支持

数据索引

支持

支持

支持

索引缓存

支持

支持

支持

支持

支持

数据可压缩

支持

空间利用

N/A

内存利用

中等

批量插入速率

支持外键

支持

InnoDB

InnoDB存储引擎是Mysql的默认存储引擎。
InnoDB存储引擎供应了具有提交、回滚、崩溃规复能力的事务安全。
但是比拟MyISAM的存储引擎,InnoDB写的处理效率差一些,并且会占用更多的磁盘空间以保留数据和索引。

InnoDB存储引擎不同于其他存储引擎的特点,有如下几个 :

MVCC

InnoDB采取MVCC来支持高并发,并且实现了四个标准的隔离级别。
其默认级别是 REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的涌现。
间隙锁使得InnoDB不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。

这四个隔离级别,间隙锁等,我们在之后的锁和事务篇章,再来详细谈谈。

事务掌握

create table goods_innodb(id int NOT NULL AUTO_INCREMENT,name varchar(20) NOT NULL, primary key(id))ENGINE=innodb DEFAULT CHARSET=utf8;start transaction;insert into goods_innodb(id,name)values(null,'Meta20');commit;外键约束

MySQL支持外键的存储引擎只有InnoDB , 在创建外键的时候, 哀求父表必须有对应的索引 , 子表在创建外键的时候, 也会自动的创建对应的索引。

这便是为什么我们没有创建索引的时候,只能选主键作为外键,由于主键会默认创建索引

在创建索引时, 可以指定在删除、更新父表时,对子表进行的相应操作,包括 RESTRICT、CASCADE、SET NULL 和 NO ACTION。

RESTRICT(限定)和 NO ACTION相同, 是指 -> 删除父表时,如果子表有关联记录的情形时, 父表没法成功删除;

如果删除的是子表的话,是没有约束的。

CASCADE表示父表在更新或者删除时,更新或者删除子表对应的记录;

相称于两者同步,共死活

SET NULL 则表示父表在更新或者删除的时候,子表的对应字段被SET NULL 。
针对上面创建的两个表, 子表的外键指定是ON DELETE RESTRICT , 那么在主表删除记录的时候, 如果子表有对应记录, 则不许可删除, ON UPDATE CASCADE 办法的,主表在更新记录的时候, 如果子表有对应记录, 则子表对应更新 。
小demo

下面两张表中 , country_innodb是父表 , country_id为主键索引,city_innodb表是子表,country_id字段为外键,对应于country_innodb表的主键country_id 。

create table country_innodb(country_id int NOT NULL AUTO_INCREMENT, country_name varchar(100) NOT NULL, primary key(country_id))ENGINE=InnoDB DEFAULT CHARSET=utf8;create table city_innodb(city_id int NOT NULL AUTO_INCREMENT, city_name varchar(50) NOT NULL, country_id int NOT NULL, primary key(city_id), key idx_fk_country_id(country_id), CONSTRAINT `fk_city_country` FOREIGN KEY(country_id) REFERENCES country_innodb(country_id) ON DELETE RESTRICT ON UPDATE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ON DELETE RESTRICT:删除主表,如果有关联记录,不删除-- ON UPDATE CASCADE:更新主表,如果子表有关联记录,更新子表记录insert into country_innodb values(null,'China'),(null,'America'),(null,'Japan');insert into city_innodb values(null,'Xian',1),(null,'NewYork',2),(null,'BeiJing',1);

删除country_id为1 的country数据:

delete from country_innodb where country_id = 1;

查看外键

show create table city_innodb ;

文件存储办法

InnoDB 存储表和索引有以下两种办法 :①. 利用共享表空间存储, 这种办法创建的表的表构造保存在.frm文件中, 数据和索引保存在 innodb_data_home_dir 和 innodb_data_file_path定义的表空间中,可以是多个文件。

②. 利用多表空间存储, 这种办法创建的表的表构造仍旧存在 .frm 文件中,但是每个表的数据和索引单独保存在 .ibd 中。

锁机制是行锁而不是表锁

详细有关于锁方面的知识,我们后续锁与事务篇再详细磋商!

MyISAM不支持事务,自然访问速率会比较快,比较适宜大量的读操作select和插入操作insert;不支持外键。
文件存储办法

每个MyISAM在磁盘上存储成3个文件,其文件名都和表名相同,但拓展名分别是 :

.frm (存储表定义);.MYD(MYData , 存储数据);.MYI(MYIndex , 存储索引);InnoDB和MyISAM差异外键和事务,以及锁机制(上文已提及到)InnoDB 是聚簇索引,MyISAM 是非聚簇索引。

也叫主键索引和赞助索引

聚簇索引的文件存放在主键索引的叶子节点上,而非聚簇索引须要两次查询,先查询到主键,然后再通过主键查询到数据。
(在索引篇中的索引分类有更详细的阐明,感兴趣的小伙伴可以先看看)。
MyISAM 是非聚簇索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和赞助索引是独立的。
InnoDB 不保存表的详细行数,实行select count() 时须要全表扫描。
而 MyISAM 用一个变量保存了全体表的行数,实行上述语句时只须要读出该变量即可,速率相对快了很多;

当然,这里也不是绝对的,看下边的剖析:

MyISAM 快的条件是:select count() 语句没有where条件,无需筛选,才能直接通过读出变量得到详细行数,如果须要筛选的话,自然没办法直接通过读取变量,就得到详细行数了。

自增主键干系

这个可能会涌如今口试题喔!

8.0版本MyISAM:当我们数据库主键已经自增到16时,此时删除14,15,16这三条记录,MySQL重启后的下一次插入,会从17开始,由于MyISAM表会把自增主键的最大ID记录到数据文件中,重启MySQL自增主键的最大ID也不会丢失;而InnoDB 则不会,下一次插入是从14开始。
由于InnoDB 表只是把自增主键的最大ID记录到内存中,以是重启MySQL或对表进行OPTION操作,都会导致最大ID丢失。
5.7版本5.7版本时,重启后最大ID都会丢失的。
MEMORY(理解)

Memory存储引擎将表的数据存放在内存中。
每个MEMORY表示实对应一个磁盘文件,格式是.frm ,该文件中只存储表的构造,而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高全体表的效率。

MEMORY 类型的表访问非常地快,由于他的数据是存放在内存中的,并且默认利用HASH索引 , 但是做事一旦关闭,表中的数据就会丢失。

MERGE(理解,但是觉得还不错的样子)

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须构造完备相同,MERGE表本身并没有存储数据,对MERGE类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行的。

对付MERGE类型表的插入操作,是通过INSERT_METHOD子句定义插入的表,可以有3个不同的值,利用FIRST 或 LAST 值使得插入操作被相应地浸染在第一或者末了一个表上,不定义这个子句或者定义为NO,表示不能对这个MERGE表实行插入操作。

可以对MERGE表进行DROP操作,但是这个操作只是删除MERGE表的定义,对内部的表是没有任何影响的。

1)创建3个测试表 order_1990, order_1991, order_all , 个中order_all是前两个表的MERGE表 :

create table order_1990(order_id int ,order_money double(10,2),order_address varchar(50),primary key (order_id))engine = myisam default charset=utf8;create table order_1991(order_id int ,order_money double(10,2),order_address varchar(50),primary key (order_id))engine = myisam default charset=utf8;create table order_all(order_id int ,order_money double(10,2),order_address varchar(50),primary key (order_id))engine = merge union = (order_1990,order_1991) INSERT_METHOD=LAST default charset=utf8;

2)分别向两张表中插入记录

insert into order_1990 values(1,100.0,'北京');insert into order_1990 values(2,100.0,'上海');insert into order_1991 values(10,200.0,'北京');insert into order_1991 values(11,200.0,'上海');

若是往order_all中插入一条记录 ,由于在MERGE表定义时,INSERT_METHOD 选择的是LAST,那么插入的数据会向末了一张表中插入。

insert into order_all values(100,10000.0,'西安');

引擎选择原则

在选择存储引擎时,该当根据运用系统的特点选择得当的存储引擎。
对付繁芜的运用系统,还可以根据实际情形选择多种存储引擎进行组合(但一样平常不到万不得已,不要混用多种存储引擎,否则可能带来一系列繁芜的问题)。
以下是几种常用的存储引擎的利用环境: ​

InnoDB : 是Mysql的默认存储引擎,用于事务处理运用程序,支持外键。
如果运用对事务的完全性有比较高的哀求,在并发条件下哀求数据的同等性,数据操作除了插入和查询以外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较得当的选择。
InnoDB存储引擎除了有效的降落由于删除和更新导致的锁定, 还可以确保事务的完全提交和回滚,对付类似于计费系统或者财务系统等对数据准确性哀求比较高的系统,InnoDB是最得当的选择。
MyISAM : 如果运用因此读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完全性、并发性哀求不是很高,那么选择这个存储引擎是非常得当的。
MEMORY:将所有数据保存在RAM中,在须要快速定位记录和其他类似数据环境下,可以供应几块的访问。
MEMORY的毛病便是对表的大小有限定,太大的表无法缓存在内存中,其次是要确保表的数据可以规复,数据库非常终止后表中的数据是可以规复的。
MEMORY表常日用于更新不太频繁的小表,用以快速得到访问结果。
MERGE:用于将一系列等同的MyISAM表以逻辑办法组合在一起,并作为一个工具引用他们。
MERGE表的优点在于可以打破对单个MyISAM表的大小限定,并且通过将不同的表分布在多个磁盘上,可以有效的改进MERGE表的访问效率。
这对付存储诸如数据仓储等VLDB环境十分得当。
备份的角度如果可以定期关闭做事器进行备份的话,那可以忽略。
反之,如果须要在线热备份,那么选择InnoDB是最基本的哀求。
总结逻辑架构,分层次能够让我们更好的定位到bug所在之处,高性能的热插拔更是MySQL的独特点所在。
存储引擎是基于表的,而不是基于库的,可以通过命令查看和修正存储引擎。
没有分外需求,我们都选择InnoDB,除非: 须要全文索引,只有MyISAM支持,但我们还是只管即便选择其他可行的方案,比如在InnoDB的根本上去加一些第三方工具或引擎。
插入和查询操作为主,其他操作险些很少的业务情形。
InnoDB好MyISAM的差异,口试可能会问到,须要把稳一下。
其他的存储引擎,理解理解即可。

作者:Melo_链接:https://juejin.cn/post/7065233922233204750

标签:

相关文章

QQ伪装黑客代码大全技术与风险警示

网络安全问题日益凸显。QQ作为一种流行的社交工具,成为了黑客攻击的主要目标之一。本文将针对QQ伪装黑客代码大全进行深入剖析,揭示其...

Web前端 2025-03-02 阅读1 评论0