勇闯BAT 聊聊Mysql的存储引擎

2023-11-21 07:10

本文主要是介绍勇闯BAT 聊聊Mysql的存储引擎,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 存储引擎是什么
    • 查看支持的引擎
    • 常用存储引擎介绍
      • Archive
      • Memory
      • MyISAM
      • InnoDB
      • 概要
    • 常见问题
      • MyISAM 和 InnoDB的区别
      • 存储引擎是针对实例的还是表
      • 自增主键最大值保存问题
      • InnoDB引擎是否支持hash索引

存储引擎是什么

MySQL架构可以分为4层,先看下,其所在的位置。

  • 连接层:包括了数据库连接、授权认证、安全管理等
  • Server层:包括 SQL 解析、优化、执行以及缓存等
  • 存储引擎层:包括了各种存储引擎,主要负责数据的存取等
  • 数据存储层:主要负责将数据存储在文件系统中,并完成与存储引擎的交互。

img

  • 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB。

  • 存储引擎其实就是对于数据库文件的一种存取机制,如何实现存储数据,如何为存储的数据建立索引以及如何更新,查询数据等技术实现的方法。

  • MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。

查看支持的引擎

SHOW ENGINES;

常用存储引擎介绍

Archive

压缩协议进行数据的存储,数据存储为ARZ文件的格式。在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能,拥有高效的插入速度,但是这种引擎不支持索引,所以查询性能较差一些。

特点:

  • 只支持insert和select操作
  • 只允许自增ID列建索引
  • 行级锁
  • 不支持事务
  • 数据占用磁盘少

应用场景:

  • 日志系统
  • 大量的设备采集

Memory

数据都是存储在内存中,IO效率高,服务重启数据会丢失,内存表默认只有16M。

特点:

  • 支持Hash、Btree索引
  • 不支持大数据存储类型,例如:blob、text
  • 表级锁
  • 只能使用比较运算符=,<,>,=>,= <
  • HEAP表不支持AUTO_INCREMENT

应用场景:

  • 缓存表

MyISAM

在 MySQL 5.5 版本之前是默认的存储引擎,不支持事务,也不支持外键,最大的特点是速度快,占用资源少。

特点:

  • select count(*)无需扫描所有行
  • 数据(MYD)和索引(MYI)分开存储
  • 表级锁,限制了读/写工作负载中的性能
  • 不支持事务

应用场景:

  • 通常用于Web和数据仓库配置中的只读场景。
  • 以读为主的应用程序,比如博客系统、新闻门户网站

InnoDB

它是 MySQL 5.5 版本之后默认的存储引擎,最大的特点是支持事务、行级锁定、外键约束等。

特点:

  • 数据和索引在一个文件(.ibd)
  • 行级锁
  • 支持事务

应用场景

  • 更新(删除)操作频率高,或者要保证数据的完整性。
  • 并发量高,支持事务和外键保证数据完整性。比如OA自动化办公系统。

概要

功能MyISAMInnoDBArchiveMemory
B-tree 索引YesYesNoYes
安全点恢复YesYesYesYes
集群数据库支持NoNoNoNo
聚集索引NoYesNoNo
压缩数据YesYesYesNo
数据缓存NoYesNoN/A
加密数据YesYesYesYes
外键NoYesNoNo
全文搜索索引YesYesNoNo
地理空间数据类型支持YesYesYesNo
地理空间索引支持YesYesNoNo
哈希索引NoNoNoYes
索引缓存YesYesNoN/A
锁定粒度TableRowRowTable
MVCCNoYesNoNo
复制支持YesYesYesLimited
储存限制256TB64TBNoneRAM
T树索引NoNoNoNo
事务NoYesNoNo
更新数据字典的统计信息YesYesYesYes

特别注意InnoDB的更新情况

  • MySQL 5.6和更高版本提供了对FULLTEXT索引的支持。
  • MySQL 5.7和更高版本提供了对地理空间索引的支持。

https://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html

常见问题

MyISAM 和 InnoDB的区别

存储结构MyISAMInnoDB
存储格式在磁盘上存储成三个文件。文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。在磁盘上存储成二个文件。文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据和索引集中存储.ibd。
存储空间可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
可移植性、备份及恢复数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
事务支持强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表
表锁差异只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的
表的具体行数保存有表的总行数,如果select count(*) from table;会直接取出出该值没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样

来源:https://www.jianshu.com/p/a957b18ba40d

存储引擎是针对实例的还是表

存储引擎是指定在表之上的,即一个库中的每一个表都可 以指定专用的存储引擎。

自增主键最大值保存问题

一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

1.Mysql8.0以下版本
表类型为InnoDB引擎,这条记录的ID是15。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启MYSQL或者对表OPTIMIZE操作,都会使最大ID丢失。
表类型为MylSAM引擎,这条记录的ID是18。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

2.Mysql8.0及以上版本
这条记录的ID是18,因为这个版本保存ID的值是在redo日志中的,重启之后是可以恢复的。

InnoDB引擎是否支持hash索引

上面其实已经介绍过了,是不支持Hash索引的,但是其内部有个自适应Hash索引

自适应Hash索引特征能使InnoDB在具有适当的工作负载和足够缓冲池内存的系统上执行的更像内存中的数据库的操作,且不会牺牲事务特性或可靠性,MySQL能基于监视到的搜索规则,使用索引键的前缀构建Hash索引,前缀可以是任意长度,并且可能只有b+树中的某些值出现在Hash索引中,Hash索引其实就是对经常访问的索引页进行构建的。

这又说明其实InnoDB是支持Hash索引的,但并不是真正意义上的Hash,而是通过自己的监视情况自动对某些热点索引值构建的内存Hash。可以理解为其是索引的索引

看下具体的图就很容易明白,这里借用沈剑老师的图:

但是我自己在InnoDB下怎么可以设置Hash索引呢?

这里对name做了hash索引,并没有报错,能正常执行。

CREATE TABLE `test` (`id` int(11) NOT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `name` (`name`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这也太奇怪了,使用 show index from test查看索引信息

实际上其还是BTREE索引,应该是内部自动转换为 BTREE索引了,明显的泰国人妖,外壳妹子,内核汉子。

这篇关于勇闯BAT 聊聊Mysql的存储引擎的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400698

相关文章

详解MySQL中DISTINCT去重的核心注意事项

《详解MySQL中DISTINCT去重的核心注意事项》为了实现查询不重复的数据,MySQL提供了DISTINCT关键字,它的主要作用就是对数据表中一个或多个字段重复的数据进行过滤,只返回其中的一条数据... 目录DISTINCT 六大注意事项1. 作用范围:所有 SELECT 字段2. NULL 值的特殊处

MySQL 用户创建与授权最佳实践

《MySQL用户创建与授权最佳实践》在MySQL中,用户管理和权限控制是数据库安全的重要组成部分,下面详细介绍如何在MySQL中创建用户并授予适当的权限,感兴趣的朋友跟随小编一起看看吧... 目录mysql 用户创建与授权详解一、MySQL用户管理基础1. 用户账户组成2. 查看现有用户二、创建用户1. 基

MySQL 打开binlog日志的方法及注意事项

《MySQL打开binlog日志的方法及注意事项》本文给大家介绍MySQL打开binlog日志的方法及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、默认状态二、如何检查 binlog 状态三、如何开启 binlog3.1 临时开启(重启后失效)

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w