MySQL之架构设计与历史(五)

MySQL之架构设计与历史

MyISAM存储引擎

在MySQL5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且有一个毫无疑问的缺陷就是崩溃后无法安全回复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型的数据库。尽管MyISAM引擎不支持事务、不支持崩溃后的安全回复,但它绝不是一无是处的。对于只读的数据,或者表比较小、可以忍受修复(repair)操作,则依然可以继续使用MySQL(但请不要默认使用MyISAM,而是应当默认使用InnoDB)

存储

MyISAM会将表存储在两个文件中:数据文件和索引文件,分别以.MYD和MYI为扩展名.MyISAM表可以包含动态或者静态(长度固定)行。MySQL会根据表的定义来决定采用何种行格式。MyISAM表可以存储的行记录数,一般受限于可用的磁盘空间,或者操作系统中单个文件的最大尺寸。
在MySQL5.0中,MyISAM表如果是变长行,则默认配置只能处理256TB的数据,因为指向数据记录的指针长度是6个字节。而在更早的版本中,指针长度默认是4字节,所以只能处理4GB的数据,而所有的MySQL版本都支持8字节的指针。要改变MyISAM表指针的长度(调高或者调低),可以通过修改表的MAX_ROWS和AVG_ROW_LENGTH选项的值来实现,两者相乘就是表可能达到的最大大小。修改这两个参数会导致重建整个表和表的所有所i你,这可能需要很长的时间才能完成。

MyISAM特性

作为MySQL最早的存储引擎之一,MyISAM有一些已经开发出来很多年的特性,可以满足用户的实际需求。

  • 1.加锁与并发.
    MyISAM对整张表加锁,而不是针对行。读取时需要读到的所有表加共享锁,写入时则对表加排他锁。但是在表有读取查询的同时,也可以往表中插入新的记录(这被称为并发插入,CONCURRENT INSERT)
  • 2.修复.
    对于MyISAM表,MySQL可以手工或者自动执行检查和修复操作,但这里说的修复和事务回复以及崩溃恢复是不同的概念。执行表的修复可能导致一些数据丢失,而且修复操作是非常慢的。可以通过CHECK TABLE mytable检查表的错误,如果有错误可以通过执行REPAIR TABLE mytable进行修复。另外,如果MySQL服务器已经关闭,也可以通过myisamchk命令行工具进行检查和修复操作
  • 3.索引特性.
    对于MyISAM表,即使BLOB和TEXT等长字段,也可以基于前500个字符创建索引。MyISAM也支持全文索引,这是一种基于粉刺创建的索引,可以支持复杂的查询
  • 4.延迟更新索引键(Delayed Key Write)。
    创建MyISAM表的时候,如果指定了DELAY_KEY_WRITE选项,在每次修改执行完成时,不会立刻将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区(in-memory key buffer),只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。这种方式可以极大地提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。延迟更新索引键的特性,可以在全局设置,也可以为单个表设置。

MyISAM压缩表

如果表在创建并导入数据以后,不会再进行修改操作,那么这样的表或许适合采用MyISAM压缩表。
可以使用myisampack对MyISAM表进行压缩(也叫打包pack).压缩表是不能进行修改的(除非先将表解除压缩,修改数据,然后再次压缩)。压缩表可以极大地减少磁盘空间占用,因此也可以减少磁盘I/O,从而提升查询性能。压缩表也支持索引,但索引也是只读的。以现在的硬件能力,对大多数应用场景,读取压缩表数据时的解压带来的开销影响并不大,而减少I/O带来的好处则要大得多。压缩时表中的记录时独立压缩的,所以读取单行的时候不需要去解压整个表(甚至也不解压行所在的整个页面)

MyISAM性能

MyISAM引擎设计简单,数据以紧密格式存储,所以在某些场景下的性能很好。MyISAM有一些服务器级别的性能扩展限制,比如对索引键缓冲区(key cache)的Mutex锁,MariaDB基于段(segment)的索引键缓冲区机制来避免该问题。但MySIAM最典型的性能问题还是表锁的问题,如果你发现所有的查询都长期处于"Locked"状态,那么毫无疑问表锁就是罪魁祸首

MySQL内键的其他存储引擎

MySQL还有一些有特殊用途的存储引擎。在新版本中,有些可能因为一些原因已经不再支持;另外还有些会继续支持,但是需要明确地启用后才能使用。

  • 1.Archive引擎
    Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前也不支持索引。Archive引擎会缓存所有的写并利用zlib对插入的行进行压缩,所以比MySQL表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,这类应用做数据分析时往往需要全表扫描。或者在一些需要更快速的INSERT操作的场合下也可以使用.
    Archive引擎支持行级锁和专用的缓冲区,所以可以实现高并发的插入。在一个查询开始直到返回表中存在的所有行数之前,Archive引擎会阻止其他的SELECT执行,以实现一致性读。另外,也实现了批量插入在完成之后对读操作是不可见的。这种机制模仿了事务和MVCC的一些特性,但Archive引擎不是一个事务型的引擎,而是一个针对告诉插入和压缩做了优化的简单引擎
  • 2.Blackhole引擎
    Blackhole没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。但是服务器会记录Blackhole表的日志,所以可以用于复制数据到悲苦,或者只是简单地记录到日志。这种特殊的存储引擎可以在一些特殊的复制架构和日志审核时发徽作用。但这种应用方式会碰到很多问题,因此并不推荐
  • 3.CSV引擎.
    CSV引擎可以将普通的CSV文件(逗号分割值得文件)作为MySQL的表来处理,但这种表不支持索引。CSV引擎可以在数据库运行时拷入或者拷出文件。可以将Excel等电子表格软件中的数据存储为CSV文件,然后复制到MySQL数据目录下,就能在MySQL中打开使用。同样的,如果将数据写入到一个CSV引擎表,其他的外部程序也能立即从表的数据文件中读取CSV格式的数据,因此CSV引擎可以作为一种数据交换的机制,非常有用
  • 4.Federated引擎。
    Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。最初设计该存储引擎是为了和企业级数据库如Microsoft SQL Server和Oracle的类似特性竞争的,可以说更多的是一种市场行为。尽管该引擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问题,因此默认是禁止的。MariaDB使用了它的一个后续改进版本,叫作FederatedX.
  • 5.Memory引擎
    如果需要快速地访问数据,并且这些数据不会被修改,重启以后丢失也没关系,那么使用Memory表(以前也叫做HEAP表)是非常有用的。Memory表至少比MyISAM表要快一个数量级,因为所有的数据都存在内存中,不需要进行磁盘I/O,Memory表的结构在重启以后还会保留,但数据会丢失
    Memory表在很多场景可以发挥好的作用:
    5.1 用于查找(lookup)或者映射(mapping)表,例如将邮编和州名映射的表
    5.2 用于缓存周期性聚合数据(periodically aggregated data)的结果
    5.3 用于保存数据分析中产生的中间数据
    Memory表支持Hash索引,因此查询操作非常快。虽然Memory表的速度非常快,但还是无法取代传统的基于磁盘的表。Memory表是表级锁,因此并发写入的性能较低。它不支持BLOCK或TEXT类型的列,并且每行的长度是固定的,所以即使指定了VARCHAR列,实际存储时也会转换成CHAR;这可能导致部分内存的浪费(其中一些限制在Percona版本已经解决)
    如果MySQL在执行查询的过程中需要使用临时表来保存中间结果,内部使用的临时表就是Memory表。如果中间结果太大超出了Memory表的限制,或者含有BLOB或TEXT字段,则临时表会转换成MyISAM表。
    人们经常混淆Memory表和临时表,临时表是指使用CREATE TEMPORARY TABLE语句创建的表,它可以使用任何存储引擎,因此和Memory 表不是一回事。临时表只在单个连接中可见,当连接断开时,临时表也将不复存在。
  • 6.Merge引擎
    Merge引擎是MyISAM引擎的一个变种。Merge表是由多个MyISAM表合并而来的虚拟表。如果将MySQL用于日志或者数据仓库类应用,该引擎可以发挥作用,但是引入分区功能后,该引擎已经被放弃
  • 7.NDB集群引擎
    2003年,当时的MySQL AB公司从索尼爱立信公司收购了NDB数据库,然后开发了NDB集群存储引擎,作为SQL和NDB原生协议之间的解耦。MySQL服务器、NDB集群存储引擎,以及分布式、share-noting的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群(MySQL Cluster)

MySQL引擎相关命令

MySQL查看存储引擎的命令

mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| Sequence           | YES     | Sequence Storage Engine Helper                                 | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
10 rows in set (0.11 sec)

查看建表使用的存储引擎

mysql> SHOW CREATE TABLE `tjc_project`.`app_config`;
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| app_config | CREATE TABLE `app_config` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键id',`environment_type` varchar(63) DEFAULT NULL COMMENT '环境类型',`config_key` varchar(127) DEFAULT NULL COMMENT '配置类型',`config_value` varchar(255) DEFAULT NULL COMMENT '配置的值',`status` tinyint(1) DEFAULT NULL COMMENT '开启状态 0:关闭 1:开启',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.13 sec)

查看默认的存储引擎配置

mysql> SHOW VARIABLES LIKE '%storage_engine%';
+----------------------------------+-----------------------+
| Variable_name                    | Value                 |
+----------------------------------+-----------------------+
| default_storage_engine           | InnoDB                |
| default_tmp_storage_engine       | InnoDB                |
| disabled_storage_engines         | myisam,memory,archive |
| internal_tmp_disk_storage_engine | InnoDB                |
+----------------------------------+-----------------------+
4 rows in set (0.12 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SD-WAN】香港企业进入粤港澳大湾区所面临的机遇和挑战

粤港澳大湾区发展及规划是中国其中一个主点发展战略,具备完整的多元化产业结构,城市之间建立强大的经济互补性,是国际性湾区和世界级城市群。因此,大湾区近年吸引了不少香港的创新及科技企业前往发展投资及设立据点扩展业务。本文…

增强版 Kimi:AI 驱动的智能创作平台,实现一站式内容生成(图片、PPT、PDF)!

前言 基于扣子 Coze 零代码平台,我们从零到一轻松实现了专属 Bot 机器人的搭建。 AI 大模型(LLM)、智能体(Agent)、知识库、向量数据库、知识图谱,RAG,AGI 的不同形态愈发显现,如何…

SpringBoot中注解@RestController | @ResponseBody | @Controller

ResponseBody 可以修饰类和方法 Controller 和 RestController 只能修饰类 RestController 告诉Spring,帮我们管理这个代码,我们后续访问时,才能访问到 RequestMapping 路由映射,可以修饰方法,也可以修饰类 访问地址…

【代码随想录37期】Day16 二叉树的最大深度、二叉树的最小深度、完全二叉树的节点个数

二叉树的最大深度 v1.0:迭代法 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…

【Linux网络编程】IO多种转接之Reactor

Reactor 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 基于上一篇epoll的学习,现在我们也知道epoll的工作模式有两种&#xff0c…

【UE5.1 多线程 异步】“Async Blueprints Extension”插件使用记录

目录 一、异步生成Actor示例 二、异步计算示例 参考视频 首先需要在商城中下载“Async Blueprints Extension”插件 一、异步生成Actor示例 2. 创建一个线程类,这里要指定父类为“LongAsyncTask”、“InfiniteAsyncTask”、“ShortAsyncTask”中的一个 在线程类…

el-table 实现嵌套表格的思路及完整功能代码

要实现的需求是这样的: 本来我是用 el-table 的 :span-method 方法实现的,但发现合并起来有问题,跟我的需求差距有些大,于是我想到了嵌套表格。但是嵌套完之后的样子也是很奇怪: 不要气馁,思路还是对的&a…

基于文心智能体平台打造专属情感类陪伴智能体【情绪价值提供者】

文章目录 一、文心智能体平台介绍二、文心智能体平台注册三、智能体介绍四、智能体创建过程4.1 基础配置4.2 高级配置4.3 预览调优4.4 公开发布 五、智能体使用心得六、智能体分享方式七、参考链接 一、文心智能体平台介绍 文心智能体平台是百度推出的基于文心大模型的智能体&…

计算机毕业设计 | springboot药品库存追踪与管理系统 药店管理(附源码)

1,绪论 1.1 背景调研 如今药品调价频繁,且品种繁多,增加了药品销售定价的难度。药品来货验收登记中的审查有效期环节容易出错,错收过期或有效期不足的药品。 手工模式下的药品库存难以及时掌握,虽然采取了每日进行缺…

Flask CORS: 解决跨域资源共享问题的利器

文章目录 安装和启用 CORS配置 CORS拓展 在本文中,我们介绍了如何使用 Flask-CORS 扩展来解决跨域问题。Flask-CORS 是一个方便的工具,可以帮助我们轻松地实现跨域资源共享支持。 安装和启用 CORS 要开始使用 Flask-CORS,我们需要先安装它。…

机器学习模型可视化分析和诊断神器Yellowbrick

大家好,机器学习(ML)作为人工智能的核心,近来得到巨大应用,ML是使计算机能够在无需显式编程的情况下进行学习和预测或决策。ML算法通过学习历史数据模式,来对新的未见数据做出明智的预测或决策。然而,构建和训练ML模型…

静态代理和动态代理

静态代理 代理接口 public interface Person {public String wakeUp(String name);public String lunch(String name); }被代理对象 public class Student implements Person{Overridepublic String wakeUp(String name) {System.out.println(name"星期一早上8点上班&a…

【C++风云录】数据处理新纪元:激光扫描数据处理

从libLAS到SPDLib:全面解读六大顶级数据处理库 前言 本文将探讨六个关于点云数据处理的库,包括libLAS、PDAL、PCL、LASlib、LAStools和SPDLib。每个库都将在简介、功能以及支持的格式等方面进行深入的解析和阐述。 欢迎订阅专栏:C风云录 文…

如何让程序适应ChatGPT:提升开发效率的指南

ChatGPT作为一种强大的AI助手,已经在各行各业中展现了其独特的价值。在软件开发领域,如何让程序更好地适应ChatGPT,从而提升开发效率,是一个值得深入探讨的话题。本文将介绍一些策略和方法,帮助开发者优化程序&#xf…

什么是 UUID,uuid

文章目录 一、是什么二、为什么三、怎么用 标题:深入探讨UUID:全球唯一标识符的秘密 一、是什么 在当今数字化时代,唯一标识符(UUID)在计算机科学领域扮演着重要的角色。UUID是一种用于标识信息的唯一字符串&#xff0…

工具-博客搭建

以下相关讲解均基于hexo github pages方案,请注意!!!博客搭建方案选择 参考文章1 搭建教程 参考文章1 hexo github pages搭建过程中遇到的问题 删除categories、tags 1、删除含有需要删除categories、tags的文章 2、hexo …

【intel CPU】三代牙膏的对比

1、PC处理器的选择 制程工艺 传说的“intel7”,感觉就像老婆饼,并不是7nm。 2、12代到13代其实应该归为一代,那就是大核心不行就堆小核心 3、所以智能踢掉有小核的; 3.1、CPU规格 3.2 内存规格 3.3 封装规格 其他都是一样的; …

彩色进度条(C语言版本)

.h文件 #include<stdio.h> #include<windows.h>#define NUM 101 #define LOAD_UP 50 #define LOAD_DOWN 60 #define SLEEP_SLOW 300 #define SLEEP_FAST 70 版本1&#xff1a;&#xff08;初始版&#xff09; //v1 #include "progress.h" int main() …

Spring ----> IOC

文章目录 一、 Spring 是一个包含众多工具的IoC容器二、 什么是IOC以及好处三、 如何实现loc思想四、Spring提供的实现loC的方法 --- 类注解方法注解4.1 类注解类注解概念介绍类注解的使用 4.2 方法注解Bean 一、 Spring 是一个包含众多工具的IoC容器 场景解析&#xff1a;首先…

TAS5711带EQ和DRC支持2.1声道的20W立体声8V-26V数字输入开环D类数字功放音频放大器

前言 数字功放很难搞&#xff0c;寄存器很多&#xff0c;要配置正确才有声音&#xff0c;要想声音好&#xff0c;要好好调整。 TAS5711出道很多年了&#xff0c;现在仍然在不少功放、音箱中能看到。 TAS5711特征 音频输入/输出 从 18V 电源向 8Q 负载提供 20W 功率 宽 PVDD…