MySQL进阶系列:存储引擎篇 mysql中存储引擎的作用
qiyuwang 2024-11-08 14:36 13 浏览 0 评论
本文mysql实验版本 : 5.7.21
基础架构篇了解到执行器执行这个执行计划,通过调用存储引擎的API来操作数据。
mysql提供了一系列存储引擎的API,所有的存储引擎都要符合API要求,因此可以实现这种插件式的存储引擎,可以根据不同的需求选择合适的存储引擎(就像握推杠铃一样,可以按需选择不同大小的杠铃片,嗯对的)。
存储引擎是针对表的而不是库,对于同一个库不同的表可以使用不同的存储引擎。
常见的存储引擎有 MyISAM,InnoDB,Memory
查看当前数据支持的存储引擎:
1,在新建表的时候可以选择存储引擎
CREATE TABLE 'user' (
'id' bigint(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT ''
) ENGINE = MyISAM
ENGINE = MyISAM 代表这个表的存储引擎是MyISAM 。
2,查看表相关信息,例如mysql库中的user表
- 使用show table status 查看表信息(不限版本)
需要先切换到对应的数据库下再执行此命令
mysql> use mysql;
Database changed
mysql> show table status like 'user' \G ;
*************************** 1. row ***************************
Name: user
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 3
Avg_row_length: 128
Data_length: 384
Max_data_length: 281474976710655
Index_length: 4096
Data_free: 0
Auto_increment: NULL
Create_time: 2018-06-11 09:51:16
Update_time: 2018-06-11 09:53:08
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment: Users and global privileges
1 row in set (0.00 sec)
- 还可以使用information_schema查看表信息(mysql5.0以后的版本支持)
会查出实例中所有库中的表信息,但是可以指定TABLE_SCHEMA查询指定库的表
mysql> select * from information_schema.tables where table_name = 'user' and TABLE_SCHEMA='mysql' \G;
简单介绍小输出字段的含义:
Name: 表名。
Engine: 存储引擎。
Version:版本,默认10。
Row_format: 行的格式。
Rows: 表中的行数,对应MyISAM和其他一些存储引擎,该值是精确的; 而InnoDB该值是估计的。
Avg_row_length: 平均每行包含的字节数。
Data_length: 表数据的大小(字节)。
Max_data_length: 表数据的最大容量(和存储引擎有关)。
Index_length: 索引的大小(字节)。
Data_free: 对于MyISAM表,表示已经分配但是没有使用的空间。
Auto_increment: 下一个auto_increment值。
Create_time: 表的创建时间。
Update_time: 表数据最后修改时间。
Check_time: 使用check table命令或者myisamchk工具最后一次检查表的时间。
Collation: 表的默认字符集和字符列排序规则。
Checksum: 如果启用保存的是整个表的实时校验和。
Create_options: 创建表是指定的其他选项。
Comment: 包含其他额外信息
1. InnoDB
InnoDB是mysql5.5.x开始默认的事务型引擎,也是使用最广泛的存储引擎。被设计用来处理大量短期事务的。
InnoDB所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),表的大小只受限于操作系统文件的大小。表的结构定义存在.frm后缀文件中,数据和索引集中存放在.idb后缀文件中。因为表数据和索引是在同一个文件,InnoDB的索引是聚簇索引。
InnoDB采用MVCC支持高并发,并且实现了四种标准的隔离级别(读未提交,读已提交,可重复读,可串行化),其默认级别是REPEATABLE-READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁不仅仅锁定查询涉及的行,还会对索引中的间隙行进行锁定,以防止幻影行的插入。
InnoDB表是基于聚簇索引建立的,聚簇索引对主键的查询有很高的性能。但是InnoDB的非主键索引中必须包含主键列,所以如果主键列很大的话,非主键索引也会很大。如果一张表的索引较多,主键应该尽可能的小。关于索引,后面会详细讲解。
InnoDB的内部优化,包括磁盘预读(从磁盘读取数据时采用可预测性读取),自适应哈希(自动在内存中创建hash索引以加速读操作)以及能够加速插入操作的插入缓冲区。
2. MyISAM
在mysql5.1及之前的版本,MyISAM是默认的存储引擎。提供了大量的特性,包括全文索引,压缩,空间函数等,但是不支持事务和行级锁,而且有一个严重的问题是崩溃后无法安全恢复。
MyISAM的数据表存储在磁盘上是3个文件,表结构定义存在.frm后缀文件中,表数据存储在.MYD后缀文件中,表索引存储在.MYI后缀文件中。表数据和表索引在不同的文件中,所以MyISAM索引是非聚簇索引。而且MyISAM可以存储表数据的总行数。
MyISAM表支持数据压缩,对于表创建后并导入数据以后,不需要修改操作,可以采用MyISAM压缩表。压缩命令:myisampack,压缩表可以极大的减少磁盘空间占用,因此也可以减少磁盘I/O,提高查询性能。而且压缩表中的数据是单行压缩,所以单行读取是不需要解压整个表。
3. Memory
Memory存储引擎的数据是存放在内存中的,所以如果服务器重启会导致数据丢失,但是表结构还是存在的表结构是以 .frm 后缀的文件中。
Memory默认hash索引,因此查询非常快。Memory表是表级锁,因此并发写入的性能较低。不支持BLOB或TEXT类型的列,并且每行的长度都是固定的,所以即使指定了varchar列实际存储也会转换成char,会导致内存浪费。
如果mysql查询过程中需要使用临时表来保存中间结果,内部使用的临时表就是Memory表,如果中间结果太大超出Memory表的限制或者含有BLOB或TEXT字段,那么临时表会转换成MyISAM表。
上面介绍了三种,你如何选择存储引擎呢:
- 事务 :目前只有Innodb能完美的支持事务。
- 备份 :只有Innodb有免费的在线热备方案,mysqldump不算在线热备的方案,它需要对数据加锁。
- 崩溃恢复:myisam表由于系统崩溃导致数据损坏的概率比Innodb高跟很多,而且恢复速度也没有innodb快。
- 特有的特性:如需要聚簇索引,那就需要选择innodb存储引擎,有的需要使用地理空间搜索,那就选择myisam 。
mysql的存储引擎有很多,这里主要介绍了以上3种,其中InnoDB是现在使用最广泛也是默认的存储引擎,如果没有特殊需求使用默认的即可也就是InnoDB。后面有文章详解InnoDB.
mysql进阶系列历史文章
MySQL高级相关更多内容,如锁,MVCC,读写分离,分库分表等还在持续更新中,如果有想了解的内容也可以给我留言,欢迎关注催更。
我是阿纪,用输出倒逼输入而持续学习,持续分享技术系列文章,以及全网值得收藏的好文,欢迎关注,欢迎关注公众号:纪先生笔记,一起做一个持续成长的技术人。
相关推荐
- PPO 强化学习机械臂 IK 训练过程可视化利器 Tensorboard
-
视频讲解:PPO强化学习机械臂IK训练过程可视化利器Tensorboard_哔哩哔哩_bilibili...
- 免费定时运行Python程序并存储输出文档的服务推荐
-
免费定时运行Python程序并存储输出文档的服务推荐以下是几种可以免费定时运行Python程序并存储输出结果的云服务方案:1.PythonAnywhere特点:提供免费的Python托管环境...
- 实战搭建深度学习运行
-
一、准备环境ubuntu22.04nvidia显卡这里使用的是RTX3060已安装Python3.10二、安装pip3...
- 部署Django到阿里云服务器教程
-
基于Ubuntu16.04+Python3+nginx+mysql+Django接下来先安装这些必要的环境,这些操作都是在你已经购买了阿里云服务器。并且在本地你已经搭建好了Django...
- Ubuntu 22.04安装MySQL : Qwen2.5 模型对话数据收集与微调教程
-
1安装MySQL首先来到(安装)根目录下,开启终端...
- 3D点云数据处理简明教程【Python】
-
近年来,在AR和空间计算技术的大力推动下,在Apple和Meta等大公司的支持下,最近推出了AppleVisionPro,3D理解领域受到越来越多的关注。...
- Ubuntu22.04中定时执行任务(cron)设置
-
做这个实验,主要涉及内容如下:cronTest.py待执行的python文件,代码会读入本地文件内容,并打印当前时间cron_run.sh将执行cronTest.py的语句,包装成shellcro...
- 使用vllm部署DeepSeek
-
1、基础环境1.1、基础环境准备RTX3090*2卡ubuntu22.04python3.12cuda12.4pytorch2.5.1...
- 一键打包,随时运行,Python3项目虚拟环境一键整合包的制作(Venv)
-
之前我们介绍了如何使用嵌入式Python3环境给项目制作一键整合包,在使用嵌入式Python环境时,通常是作为另一个应用程序的一部分,而Python3虚拟环境是为了在开发过程中隔离项目所需的...
- 从零开始:Ubuntu Server中MySQL 8.0的安装与Django数据库配置详解
-
Ubuntu系统纯净安装MySQL8.01、安装Mysql8.0sudoaptinstallmysql-server...
- 同一台电脑如何共存多个版本Python?
-
同一台电脑可以安装多个版本Python吗?可以共存!当前电脑安装了Python3.8.832位,为了调用大漠插件dll,但是我又想安装较新版本的64位Python3.12.0,就涉及到多个Pytho...
- zabbix企业微信告警
-
zabbix企业微信告警的前提是用户有企业微信且创建了一个能够发送消息的应用,具体怎么创建可以协同用户侧企业微信的管理员。第一步:企业微信准备我们需要的内容包括企业ID,应用的AgentId和应用的S...
- 「2022 年」崔庆才 Python3 爬虫教程 - urllib 爬虫初体验
-
首先我们介绍一个Python库,叫做urllib,利用它我们可以实现HTTP请求的发送,而不用去关心HTTP协议本身甚至更低层的实现。我们只需要指定请求的URL、请求头、请求体等信息即...
- 手把手教你搭建深度学习环境Pytorch版-Ubuntu
-
引言很多搞人工智能的小伙伴,刚开始学习,往往摸不着头脑怎么跑代码。跑代码的前提是要有个环境。本篇结合自己的亲身经历,带你搭建环境。相关知识Ubuntu是Linux系统的一种...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)