数据库存储引擎和数据类型详细介绍

目录

  • 一、数据库存储引擎(了解)
    • 1.了解MySQL体系结构
    • 2.存储引擎(了解)
      • 2.1.存储引擎的介绍
      • 2.2.存储引擎分类
      • 2.3.如何选择引擎?
    • 3.事务控制语言(TCL)
      • 事务的四个特性(ACID)
  • 二、数据类型(了解)
    • 1.整型(常用的是int)
    • 2.字符串类型
    • 3.枚举类型 enum (enumeration)
    • 4.日期类型

一、数据库存储引擎(了解)

1.了解MySQL体系结构

1
如上图所示,mysql结构总共分为4个层次,连接层/服务层/引擎层/存储层

  • 连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限
  • 服务层:第二层架构主要完成大多数的MySQL的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。
  • 引擎层:存储引擎真正负责了MySQL中数据的存储和提取,服务器通过API和存储引擎进行通信。不同的存储引擎具有不同的功能。这样我们可以根据自己的需要。来选取合适的存储引擎
  • 存储层:主要是将数据存储在文件系统之上,并完成存储引擎的交互。

2.存储引擎(了解)

2.1.存储引擎的介绍

MySQL的存储引擎指MySQL中管理数据的方式。
存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。
不同的存储引擎提供不同的存储机制、索引、锁定等功能,使用不同的存储引擎,还可以 获得特定的功能。
现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL数据库的核心就是存储引擎。
文件系统回顾: 操作系统组织和存取数据的一种机制。文件系统是一种软件。
文件系统类型:ext2 3 4 ,xfs
不管使用什么文件系统,数据内容不会变化,区别是不同的文件系统直接存储空间、大小、速度都不同
MySQL引擎:可以理解为 MySQL的“文件系统”,只不过功能更加强大。
MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。

2.2.存储引擎分类

MySQL存储引擎介绍:

  • InnoDB存储引擎:默认引擎,最常用的。
    InnoDB是事务型数据库的首选引擎,支持事务(ACID),支持行锁定和外键;InnoDB是默认的MySQL引擎

InnoDB特点:支持事务处理、支持外键、支持崩溃修复和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如12306售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为它支持事务的提交(commit)和回滚(rollback)。​

  • MyISAM存储引擎(了解)
    MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。

MyISAM特点: 插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用程序对数据的完整性、并发性要求比较低,也可以使用。​

  • MEMORY内存型引擎(了解)
    MEMORY存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供了快速访问。

MEMORY特点: 所有的数据都在内存中,数据的处理速度快,但是安全性不高,因为数据极其容易发生丢失,服务器重启后,数据就丢失了。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。但是它对表的大小有要求,不能建立太大的表。所以,这类数据库引擎只使用在相对较小的数据库表中。常见的应用场景有:需要高速缓存的表、经常被读但不被写的临时表
外键(foreign key):链接了两个表,确保数据的关系一致性。外键约束规定一个表中的数据必须匹配另一个表中的数据。
行锁定(Row locking):行锁定允许多个事务同时访问表中的不同行,只有访问同一行时才需要排队。这可以在更新数据时降低锁定的范围,提高并发效率。
事务:所有操作要么全部完成,要么全部不完成。

2.3.如何选择引擎?

具体情况具体分析,主要看业务场景,每个引擎适用不同的业务场景
如果要提供提交、回滚、并要求实现并发控制,InnoDB是一个好的选择;
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率;
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎
使用哪一种引擎需要灵活选择,一个数据库中多张表可以使用不同引擎以满足各种性能和实际需求;使用合适的存储引擎,将会提高整个数据库的性能。

存储引擎查看
mysql> show engines;
或者 show engines\G;   也可以  \G是让结果更加人性化的显示,从而更易阅读看你的mysql当前默认的存储引擎
mysql> show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| default_storage_engine           | InnoDB |
| default_tmp_storage_engine       | InnoDB |
| disabled_storage_engines         |        |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
4 rows in set (0.00 sec)
如何查看Mysql服务器上的版本
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.42    |
+-----------+
1 row in set (0.00 sec)

扩展了解知识
什么是外键:外键的主要作用是保持数据的一致性、完整性。
什么是索引:索引相当于书中的目录,可以提高数据检索的效率,降低数据库的IO。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的
什么是行锁定与锁表:可以将一张表单独锁定和可以单独锁定一行的记录。为了防止你在操作的同时也有别人在操作。
什么是事务:事务是有一步或者几步数据库的操作。这系列操作要么全部执行,要么全部放弃执行。

3.事务控制语言(TCL)

事务控制语言 (Transation Control Language),是一组能对事务进行控制的SQL语句。
有时可能需要使用 DML 进行批量数据的删除,修改,增加。DML:数据操作语言,用于操作数据(Insert、Select等)
比如,在一个员工系统中,想删除一个人的信息。除了删除这个人的基本信息外,还应该删除与此人有关的其他信息,如邮箱,地址等等。
如:

--
BEGIN;开启一个新的事务
INSERT INTO …;插入操作
SAVEPOINT point1;设置事务的第一个保存点
UPDATE … ;更新操作
SAVEPOINT point2;设置事务的第二个保存点
DELETE FROM … ;删除操作
ROLLBACK TO point1;回滚到 point1 保存点
UPDATE … ;更新操作
COMMIT;提交事务

那么从开始执行到结束,就会构成一个事务。
对于事务,要保证事务的完整性。要么全部成功,要么全部不成功,则将操作撤回。

事务的四个特性(ACID)

原子性:事务是应用中最小的执行单位,就如原子是自然界最小颗粒,事务要么成功,要么不成功。具有不可再分的特征。事务是应用中不可再分的最小执行体。(最小了,不可再分了)

一致性:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态,比如:转账前账号A和账号B的钱的总数为10000,转账后账号A和账号B的前的总数应该还是10000;当数据库中只包含事务成功提交的结果时,数据库处于一致性状态。一致性是通过原子性来保证的。

隔离性:并发执行的事务之间不能互相影响。当涉及到多用户操作同一张表时,数据库会为每一个用户开启一个事务。各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不相互影响。(说白了,就是你做你的,我做我的!)

持续性:持续性也称为持久性指事务一旦提交对数据所做的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。即使数据库崩溃了,我们也要保证事务的完整性。即:一个事务一旦提交,它对数据库中数据的改变就是永久性的,即便发生系统故障也不会丢失。

二、数据类型(了解)

在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型。
同时,MySQL数据库管理系统也提供了数据类型决定表存储数据的类型。
常见的数据类型

1.整型(常用的是int)

作用:用于存储用户的年龄、游戏的Level、经验值等。
分类:tinyint smallint mediumint int bigint
取值范围:

MySQL数据类型最小值最大值
tinyint(n)0255
smallint(n)-32,76832,767
mediumint(n)-83886088388607
int(n)-2,147,483,6482,147,483,647
bigint(n)-9,223,372,036,854,775,8089,223,372,036,854,7

结论:

  • 当整数值超过 int 数据类型支持的范围时,就可以采用 bigint。
  • 在 MySQL 中,int 数据类型是主要的整数的数据类型。
mysql> create table t4 (id int);
Query OK, 0 rows affected (0.00 sec)
​
mysql> desc t4;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)
​
mysql> insert into t4 values(1);
Query OK, 1 row affected (0.01 sec)
​
mysql> select * from t4;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

2.字符串类型

作用:用于存储用户的姓名、爱好、电话,邮箱地址,发布的文章等
字符类型 char varchar

  • char表示【定长字符串】,长度是固定的;如果插入数据的长度【小于】char的固定长度时,则用空格填充;因为长度固定,所以存取速度要比varchar快很多,甚至能快50%,但正因为其长度固定,所以会占据多余的空间。
    char(10)根据10来限制,一定会占10个,小于10个用空格补齐。
    列的长度是固定在为创建表时,声明的长度:0 ~ 255
    即:创建表时,在char类型后面使用小括号()指定最大长度。比如char(10)、char(100)等。
    该长度表示char能存储的最大字符数。它是固定的,不能变化。
    允许的长度从0到255个字符。也就是说char(0)到 char(255)都是允许的。

  • varchar表示【可变长字符串】,长度是可变的;插入的数据是多长,就按照多长来存储;varchar在存取方面与char相反,它存取慢,因为长度不固定,但正因如此,不占据多余的空间。
    varchar(10) 根据实际字符串长度占空间,最多10个
    列中的值为可变长字符串长度为:0 ~ 65535
    即:varchar 列中的值是可变长度的字符串,其长度可以在 0(空字符串)到 65535(最长字符串)个字符之间。

结合性能角度(char更快),节省磁盘空间角度(varchar更小),具体情况还需具体来设计数据库才是妥当的做法。

总结:
1、经常变化的字段用varchar
2、知道固定长度的用char
3、超过255字符的只能用varchar或者text
4、能用varchar的地方不用text(文本格式)

案例:

mysql> create table t8(c char(5),v varchar(12));
Query OK, 0 rows affected (0.42 sec)mysql> insert into t8 values('abcde','abcdef');
Query OK, 1 row affected (0.38 sec)
​
mysql> insert into t8 values('abc','abcdef');  #char可以少于规定长度。
Query OK, 1 row affected (0.05 sec)
​
mysql> insert into t8 values('abc777','abcdef7');  #char不能大于规定的长度。
ERROR 1406 (22001): Data too long for column 'c' at row 1

3.枚举类型 enum (enumeration)

ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值,有限制的时候用枚举。其语法格式:<字段名> ENUM( ‘值1’, ‘值1’, …, ‘值n’ )
案例:

mysql> create table t101(name enum('tom','jim'));    #只能从tom,jim两个里面2选其1
mysql> INSERT INTO t101 VALUES('tom');    #插入数据
Query OK, 1 row affected (0.00 sec)

4.日期类型

时间和日期类型测试:year、date、time、datetime、timestamp
作用:用于存储用户的注册时间,文章的发布时间,文章的更新时间,员工的入职时间等
注意事项:
插入年份时,尽量使用4位值
插入两位年份时,<=69,以20开头,比如65, 结果2065
>=70,以19开头,比如82,结果1982
案例:

#创建表格
mysql> create table test_time(d date,t time,dt datetime);
Query OK, 0 rows affected (0.03 sec)#查看表结构
mysql> desc test_time;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)#插入数据
mysql> insert into test_time values(now(),now(),now());
Query OK, 1 row affected, 1 warning (0.02 sec)#查询数据
mysql> select * from test_time;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2023-07-04 | 03:26:01 | 2023-07-04 03:26:01 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
​
​
#测试年:新建一个表格,指定字段是born_yesr,数据类型是year
mysql> create table t3(born_year year);
Query OK, 0 rows affected (0.40 sec)#查看表结构
mysql> desc t3;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| born_year | year(4) | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)#插入数据
mysql> insert into t3 values (12),(80);
Query OK, 2 rows affected (0.06 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
+-----------+
2 rows in set (0.00 sec)#插入数据
mysql> insert into t3 values (2019),(81);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from t3;
+-----------+
| born_year |
+-----------+
|      2012 |
|      1980 |
|      2019 |
|      1981 |
+-----------+
4 rows in set (0.00 sec)

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

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

相关文章

【Vue.js】使用Element中的Mock.js搭建首页导航左侧菜单---【超高级教学】

一&#xff0c;Mock.js 1.1 认识Mock.js Mock.js是一个用于前端开发中生成随机数据、模拟接口响应的 JavaScript 库。模拟数据的生成器&#xff0c;用来帮助前端调试开发、进行前后端的原型分离以及用来提高自动化测试效率 总结来说&#xff0c;Element中的Mock.js是一个用于…

龙迅LT9611UXC 2PORT MIPICSI/DSI转HDMI(2.0)转换器+音频,内置MCU

龙迅LT9611UXC 1.描述&#xff1a; LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单 端口或双端口&#xff0c;1高速时钟通道和1~4高速数据通道&#xff0c;最大2Gbps/通道&#xff0c;可支持高达16Gbps的总带 宽。LT9611UXC支持突发…

7、Docker网络

docker网络模式能干嘛&#xff1f; 容器间的互联和通信以及端口映射 容器IP变动时候可以通过服务名直接网络通信而不受到影响 docker 网络模式采用的是桥接模式&#xff0c;当我们创建了一个容器后docker网络就会帮我们创建一个虚拟网卡&#xff0c;这个虚拟网卡和我们的容器网…

Appium混合页面点击方法tap的使用

原生应用开发&#xff0c;是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发&#xff1b;HTML5&#xff08;h5&#xff09;应用开发&#xff0c;是利用Web技术进行的App开发。目前&#xff0c;市面上很多app都是原生和h5混合开发&#xff0c…

C理解(四):链表

本文主要探讨单链表与双链表相关知识。 linux内核链表(include/linux/list.h) 内核链表中纯链表封装,纯链表的各种操作函数&#xff08;节点创建、插入、删除、遍历&#xff09;,纯链表内嵌在驱动结构体中,实现驱动的创建、插入、删除、遍历等 单链表 单链表链表头插…

FileManager/本地文件增删改查, Cache/图像缓存处理 的操作

1. FileManager 本地文件管理器&#xff0c;增删改查文件 1.1 实现 // 本地文件管理器 class LocalFileManager{// 单例模式static let instance LocalFileManager()let folderName "MyApp_Images"init() {createFolderIfNeeded()}// 创建特定应用的文件夹func cr…

【Java 进阶篇】MySQL 数据控制语言(DCL):管理用户权限

MySQL 是一个强大的关系型数据库管理系统&#xff0c;提供了丰富的功能和选项来管理数据库和用户。数据库管理员&#xff08;DBA&#xff09;通常使用数据控制语言&#xff08;Data Control Language&#xff0c;简称 DCL&#xff09;来管理用户的权限和访问。 本文将详细介绍…

uni-app 之 短信验证码登录

uni-app 之 短信验证码登录 image.png image.png <template><view style"width: 100%; display: flex; flex-direction:column; align-items:center;"><view style"width: 300px; margin-top: 100px;"><!-- // --><!-- 1&#…

JUnit介绍

JUnit是用于编写和运行可重复的自动化测试的开源测试框架&#xff0c; 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。 JUnit提供&#xff1a; 断言测试预期结果。 测试功能共享通用的测试数据。 测试套件轻…

新闻报道的未来:自动化新闻生成与爬虫技术

概述 自动化新闻生成是一种利用自然语言处理和机器学习技术&#xff0c;从结构化数据中提取信息并生成新闻文章的方法。它可以实现大规模、高效、多样的新闻内容生产。然而&#xff0c;要实现自动化新闻生成&#xff0c;首先需要获取可靠的数据源。这就需要使用爬虫技术&#…

【AI视野·今日NLP 自然语言处理论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 29 Sep 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MindShift: Leveraging Large Language Models for Mental-States-Based Problematic Smartphone Use Interve…

Source Insight 工具栏图标功能介绍

这篇文章并不介绍 Source Insight 的具体使用方法&#xff0c;这类教程网上有很多&#xff0c;这里只分析 Souce Insight 工具栏图标的功能。 文章目录 Source Insight 简介Souce Insight 工具栏文件操作新建&#xff08;CtrlN&#xff09;打开&#xff08;CtrlO&#xff09;保…

自学WEB后端02-基于Express框架完成一个交互留言板!

提示&#xff1a; 浏览器V8是JavaScript的前端运行环境 Node.js 是JavaScript 的后端运行环境 Node.js 中无法调用 DOM 和 BOM等浏览器内置 API 这个作业案例包含2部分内容&#xff0c; 第一部分是前端 前端完成界面内容CSS框架 第二部分是后端 完成用户留言存储&#xf…

overleaf杂谈-Springer文献格式问题

目录 overleaf写作问题记录1.Latex中的%问题&#xff08;文本变成灰色&#xff09;2.Springer文献格式问题2.1 新建reference.bib2.2 谷歌学术搜索文章并引用2.3 复制BibTex2.4 复制进reference.bib2.5 在sn-article.tex的\end{document}前添加语句2.6 引用文献2.7 Springer模板…

NLP 03(LSTM)

一、LSTM LSTM (Long Short-Term Memory) 也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比&#xff1a; 能够有效捕捉长序列之间的语义关联缓解梯度消失或爆炸现象 LSTM的结构更复杂,它的核心结构可以分为四个部分去解析: 遗忘门、输入门、细胞状态、输出门 LSTM内部结构…

Android 使用Kotlin封装RecyclerView

文章目录 1.概述2.运行效果图3.代码实现3.1 扩展RecyclerView 3.2 扩展Adapter3.3 RecyclerView装饰绘制3.3.1 以图片实现分割线3.3.2 画网格线3.3.3空白的分割线3.3.4 不同方向上的分割线 3.4 使用方法 1.概述 在一个开源项目上看到了一个Android Kotlin版的RecyclerView封装…

Backblaze发布2023中期SSD故障数据质量报告

作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告&#xff0c;给大家提供了一份真实应用场景下的稳定性分析参考数据。 本文我们主要看下Backblaze最新发布的2023中期SSD相关故障稳定性数据报告。…

[题]欧拉函数 #欧拉函数

目录 欧拉函数一、用公式求代码 二、线性筛法求欧拉函数扩展欧拉定理 欧拉函数 AcWing 873. 欧拉函数 一、用公式求 定义&#xff1a;1 ~ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为ϕ(N)。 怎么求呢&#xff1f;&#xff1f; 有一个公式&#xff1a; N p1a1 X…

RabbitMQ的工作模式——WorkQueues模式

1.工作队列模式 生产者代码 public class Producer_WorkQueues1 {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.133&qu…

flutter开发实战-应用更新apk下载、安装apk、启动应用实现

flutter开发实战-应用更新apk下载、安装apk、启动应用实现 在开发过程中&#xff0c;经常遇到需要更新下载新版本的apk文件&#xff0c;之后进行应用更新apk下载、安装apk、启动应用。我们在flutter工程中实现下载apk&#xff0c;判断当前版本与需要更新安装的版本进行比对判断…