资讯专栏INFORMATION COLUMN

MySQL - 常见的三种存储引擎

Pocher / 2220人阅读

摘要:的核心就是插件式存储引擎。列的值表示某种引擎是否能使用表示可以使用表示不能使用表示该引擎为当前默认的存储引擎。主要特性为提供了具有提交回滚和崩溃恢复能力的事物安全兼容存储引擎。它是在数据仓储和其他应用环境下最常使用的存储引擎之一。

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySql的核心就是插件式存储引擎。

存储引擎
查看存储引擎
SHOW ENGINES

命令来查看MySQL使用的引擎,命令的输出为(我用的Navicat Premium):

由此可见,MySQL给用户提供了诸多的存储引擎,包括处理事务安全表的引擎和出来了非事物安全表的引擎。

如果要想查看数据库默认使用哪个引擎,可以通过使用命令:

SHOW VARIABLES LIKE "storage_engine";

在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。Support列的值表示某种引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎。下面来看一下其中几种常用的引擎。

InnoDB存储引擎(推荐)

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。

InnoDB主要特性

为MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合

InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上

InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

使用 InnoDB存储引擎 MySQL将在数据目录下创建一个名为 ibdata1 的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0ib_logfile1的5MB大小的日志文件

MyISAM存储引擎

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

MyISAM主要特性:

被大文件系统和操作系统支持

当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,若下一个块被删除,就扩展到下一块自动完成

每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16

最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上

BLOB和TEXT列可以被索引

NULL被允许在索引的列中,这个值占每个键的0~1个字节

所有数字键值以高字节优先被存储以允许一个更高的索引压缩

每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快

可以把数据文件和索引文件放在不同目录

每个字符列可以有不同的字符集

有VARCHAR的表可以固定或动态记录长度

VARCHAR和CHAR列可以多达64KB

使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)

MEMORY存储引擎

MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。

MEMORY主要特性:

MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度

MEMORY存储引擎执行HASH和BTREE缩影

可以在一个MEMORY表中有非唯一键值

MEMORY表使用一个固定的记录长度格式

MEMORY不支持BLOB或TEXT列

MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引

MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)

MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享

当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROMTRUNCATE TABLE,或者删除整个表(使用DROP TABLE)

存储引擎的选择

在实际工作中,选择一个合适的存储引擎是一个比较复杂的问题。每种存储引擎都有自己的优缺点,不能笼统地说谁比谁好。但建议选择使用InnoDB

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

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

MEMORY: 所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

注意:同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

说点什么

关注微信公众号:battcn 后台回复 mysql 即可获得 《打造扛得住的MySQL数据库架构》

个人QQ:1837307557

battcn开源群(适合新手):391619659

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/47439.html

相关文章

  • mysql 修改表存储引擎三种方法

    摘要:直接修改优点是简单直接缺点是需要执行很长时间,会按行将原数据复制到一张新表中,复制期间会消耗系统所有的能力,并且会在原表上加读锁使用工具使用工具将表保存到文件,打开文件修改表的存储引擎以及表名创建与查询执行语句如果数据量比较大,可以根据主键 1.直接修改 alert table mytable engine = InnoDB; 优点是简单直接 缺点是需要执行很长时间,mysql会按行...

    vincent_xyb 评论0 收藏0
  • 面试官:聊一下你对MySQL索引实现原理?

    摘要:一个表中可以有多个辅助索引。哈希算法是一种常用的算法,时间复杂度为。哈希算法存储引擎使用哈希算法来对字典进行查找,哈希碰撞采用转链表解决,哈希函数采用除法散列方式。所以说哈希索引只能用于搜索等值查询,范围查询是不能使用哈希索引。 在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,我们要追求两者的一个平衡点,足够多的索引带来查询性能提高,...

    caozhijian 评论0 收藏0
  • 搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    摘要:支持崩溃后的安全恢复。的使用场景更新密集的表存储引擎特别适合处理多重并发的更新请求。外键约束支持外键的存储引擎只有。引擎是及之前版本的默认存储引擎。文件存储表的索引。引擎存储引擎是引擎的变种。 MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

    lmxdawn 评论0 收藏0
  • 搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

    摘要:支持崩溃后的安全恢复。的使用场景更新密集的表存储引擎特别适合处理多重并发的更新请求。外键约束支持外键的存储引擎只有。引擎是及之前版本的默认存储引擎。文件存储表的索引。引擎存储引擎是引擎的变种。 MySQL基础知识点整理 - 存储引擎 0. 查看 MySQL 支持的存储引擎 可以在 mysql 客户端中,使用 show engines; 命令可以查看MySQL支持的引擎: mysql> ...

    whatsns 评论0 收藏0
  • MySQL的锁和事务隔离级别

    摘要:隔离级别越低,事务请求的锁越少或持锁时间越短,因此大部分数据库的默认隔离级别为。但是有相关的分析也指出,隔离级别的性能开销几乎一样,因此用户无须通过调整隔离级别来提高性能。这也是隔离级别的一大特性。 如今的互联网,开发一个大型的多人APP,你一定离不开数据库。而如何保证所有人能够高并发的进行读写一直是一个高难度的架构问题,先刨去高并发,保证一致性读写这个问题最常用的手段是事务,而实现一...

    littleGrow 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<