首页数据库数据库存储引擎 数据库引擎

数据库存储引擎 数据库引擎

编程之家2026-05-25619次浏览

其实数据库存储引擎的问题并不复杂,但是又很多的朋友都不太了解数据库引擎,因此呢,今天小编就来为大家分享数据库存储引擎的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

数据库存储引擎 数据库引擎

Mysql数据库3种存储引擎有什么区别

Mysql数据库3种存储(MyISAM、MEMORY、InnoDB)引擎区别:

1、Myisam是Mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用Myisam。MEMORY、InnoDB不是默认存储引擎。

2、InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

Mysql数据库3种存储(MyISAM、MEMORY、InnoDB)区别对比:

1、MyISAM

它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。

数据库存储引擎 数据库引擎

数据文件和索引文件可以放置在不同的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,需要在创建表的时候通过DATA DIRECTORY和INDEX DIRECTORY语句指定,文件路径需要使用绝对路径。

2、MEMORY

memory使用存在内存中的内容来创建表。每个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。

默认情况下,memory数据表使用散列索引,利用这种索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了。因此,散列索引值适合使用在"="和"<=>"的操作符中,不适合使用在"<"或">"操作符中,也同样不适合用在order by字句里。如果确实要使用"<"或">"或betwen操作符,可以使用btree索引来加快速度。

存储在MEMORY数据表里的数据行使用的是长度不变的格式,因此加快处理速度,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型。VARCHAR是一种长度可变的类型,但因为它在MySQL内部当作长度固定不变的CHAR类型,所以可以使用。

3、InnoDB

数据库存储引擎 数据库引擎

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

(1)自动增长列:

InnoDB表的自动增长列可以手工插入,但是插入的如果是空或0,则实际插入到则是自动增长后到值。可以通过"ALTER TABLE...AUTO_INCREMENT=n;"语句强制设置自动增长值的起始值,默认为1,但是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。

可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入多条记录,那么返回的是第一条记录使用的自动增长值。对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。

(2)外键约束:

MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。

MySQL数据库存储引擎详解

存储引擎是什么?

MySQL中的数据用各种不同的技术存储在文件(或者内存)中这些技术中的每一种技术都使用不同的存储机制索引技巧锁定水平并且最终提供广泛的不同的功能和能力通过选择不同的技术你能够获得额外的速度或者功能从而改善你的应用的整体功能

例如如果你在研究大量的临时数据你也许需要使用内存存储引擎内存存储引擎能够在内存中存储所有的表格数据又或者你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)

这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型) MySQL默认配置了许多不同的存储引擎可以预先设置或者在MySQL服务器中启用你可以选择适用于服务器数据库和表格的存储引擎以便在选择如何存储你的信息如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性

选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储遗憾的是其它类型的数据库解决方案采取的一个尺码满足一切需求的方式意味着你要么就牺牲一些性能要么你就用几个小时甚至几天的时间详细调整你的数据库使用MySQL我们仅需要修改我们使用的存储引擎就可以了

在这篇文章中我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面)相反我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎为了实现这个目的在介绍每一个存储引擎的具体情况之前我们必须要了解一些基本的问题

如何确定有哪些存储引擎可用

你可以在MySQL(假设是MySQL服务器以上版本)中使用显示引擎的命令得到一个可用引擎的列表

mysql>showengines;++++|Engine|Support|Comment|++++|MyISAM|DEFAULT|DefaultengineasofMySQL withgreatperformance||HEAP|YES|AliasforMEMORY||MEMORY|YES|Hashbased storedinmemory usefulfortemporarytables||MERGE|YES|CollectionofidenticalMyISAMtables||MRG_MYISAM|YES|AliasforMERGE||ISAM|NO|Obsoletestorageengine nowreplacedbyMyISAM||MRG_ISAM|NO|Obsoletestorageengine nowreplacedbyMERGE||InnoDB|YES|Supportstransactions row levellocking andforeignkeys||INNOBASE|YES|AliasforINNODB||BDB|NO|Supportstransactionsandpage levellocking||BERKELEYDB|NO|AliasforBDB||NDBCLUSTER|NO|Clustered fault tolerant memory basedtables||NDB|NO|AliasforNDBCLUSTER||EXAMPLE|NO|Examplestorageengine||ARCHIVE|NO|Archivestorageengine||CSV|NO|CSVstorageengine|++++ rowsinset( sec)这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎

对于MySQL以前版本可以使用mysql> show variables like have_%(显示类似 have_%的变量):

mysql>showvariableslike have_%;+++|Variable_name|Value|+++|have_bdb|YES||have_crypt|YES||have_innodb|DISABLED||have_isam|YES||have_raid|YES||have_symlink|YES||have_openssl|YES||have_query_cache|YES|+++ rowsinset( sec)你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎如果你在使用一个预先包装好的MySQL二进制发布版软件那么这个软件就包含了常用的引擎然而需要指出的是如果你要使用某些不常用的引擎特别是CSV RCHIVE(存档)和BLACKHOLE(黑洞)引擎你就需要手工重新编译MySQL源码

使用一个指定的存储引擎

你可以使用很多方法指定一个要使用的存储引擎最简单的方法是如果你喜欢一种能满足你的大多数数据库需求的存储引擎你可以在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine选项)或者在启动数据库服务器时在命令行后面加上 default storage engine或 default table type选项

更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎最直接的方式是在创建表时指定存储引擎的类型向下面这样:

CREATE TABLE mytable(id int title char()) ENGINE= INNODB

你还可以改变现有的表使用的存储引擎用以下语句:

ALTER TABLE mytable ENGINE= MyISAM

然而你在以这种方式修改表格类型的时候需要非常仔细因为对不支持同样的索引字段类型或者表大小的一个类型进行修改可能使你丢失数据如果你指定一个在你的当前的数据库中不存在的一个存储引擎那么就会创建一个MyISAM(默认的)类型的表

各存储引擎之间的区别

为了做出选择哪一个存储引擎的决定我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能这种功能使我们能够把不同的存储引擎区别开来我们一般把这些核心功能分为四类:支持的字段和数据类型锁定类型索引和处理一些引擎具有能过促使你做出决定的独特的功能我们一会儿再仔细研究这些具体问题

字段和数据类型

虽然所有这些引擎都支持通用的数据类型例如整型实型和字符型等但是并不是所有的引擎都支持其它的字段类型特别是BLOG(二进制大对象)或者TEXT文本类型其它引擎也许仅支持有限的字符宽度和数据大小

这些局限性可能直接影响到你可以存储的数据同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响这些区别能够影响你的应用程序的性能和功能因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策

锁定

数据库引擎中的锁定功能决定了如何管理信息的访问和更新当数据库中的一个对象为信息更新锁定了在更新完成之前其它处理不能修改这个数据(在某些情况下还不允许读这种数据)

锁定不仅影响许多不同的应用程序如何更新数据库中的信息而且还影响对那个数据的查询这是因为查询可能要访问正在被修改或者更新的数据总的来说这种延迟是很小的大多数锁定机制主要是为了防止多个处理更新同一个数据由于向数据中插入信息和更新信息这两种情况都需要锁定你可以想象多个应用程序使用同一个数据库可能会有很大的影响

不同的存储引擎在不同的对象级别支持锁定而且这些级别将影响可以同时访问的信息得到支持的级别有三种:表锁定块锁定和行锁定支持最多的是表锁定这种锁定是在MyISAM中提供的在数据更新时它锁定了整个表这就防止了许多应用程序同时更新一个具体的表这对应用很多的多用户数据库有很大的影响因为它延迟了更新的过程

页级锁定使用Berkeley DB引擎并且根据上载的信息页( KB)锁定数据当在数据库的很多地方进行更新的时候这种锁定不会出现什么问题但是由于增加几行信息就要锁定数据结构的最后 KB当需要增加大量的行也别是大量的小型数据就会带来问题

行级锁定提供了最佳的并行访问功能一个表中只有一行数据被锁定这就意味着很多应用程序能够更新同一个表中的不同行的数据而不会引起锁定的问题只有InnoDB存储引擎支持行级锁定

建立索引

建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能不同的存储引擎提供不同的制作索引的技术有些技术也许会更适合你存储的数据类型

有些存储引擎根本就不支持索引其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)

事务处理

事务处理功能通过提供在向表中更新和插入信息期间的可靠性这种可靠性是通过如下方法实现的它允许你更新表中的数据但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改例如在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成才接受所做的修改如果任一项操作失败了你都可以取消这个事务处理这些修改就不存在了如果这个事务处理过程完成了我们可以通过允许这个修改来确认这个操作

lishixinzhi/Article/program/MySQL/201311/29301

mysql存储引擎类型有哪些

1、MyISAM

使用这个存储引擎,每个MyISAM在磁盘上存储成三个文件。

(1)frm文件:存储表的定义数据

(2)MYD文件:存放表具体记录的数据

(3)MYI文件:存储索引

frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。下面这张图就是MYI文件保存的机制:

从这张图可以发现,这个存储引擎通过MYI的B+树结构来查找记录页,再根据记录页查找记录。并且支持全文索引、B树索引和数据压缩。

支持数据的类型也有三种:

(1)静态固定长度表

这种方式的优点在于存储速度非常快,容易发生缓存,而且表发生损坏后也容易修复。缺点是占空间。这也是默认的存储格式。

(2)动态可变长表

优点是节省空间,但是一旦出错恢复起来比较麻烦。

(3)压缩表

上面说到支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。

有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

2、InnoDB

InnoDB是默认的数据库存储引擎,他的主要特点有:

(1)可以通过自动增长列,方法是auto_increment。

(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。

(3)使用的锁粒度为行级锁,可以支持更高的并发;

(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。

(5)配合一些热备工具可以支持在线热备份;

(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;

(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

当然InnoDB的存储表和索引也有下面两种形式:

(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。

(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。

对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

3、Memory

将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。

(1)支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;

(2)支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;

(3)由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;

(4)查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;

(5)默认使用hash索引。

(6)如果一个内部表很大,会转化为磁盘表。

在这里只是给出3个常见的存储引擎。使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能

文章到此结束,如果本次分享的数据库存储引擎和数据库引擎的问题解决了您的问题,那么我们由衷的感到高兴!

社区源码下载 源码仓库c语言入门自学pdf(c语言入门经典电子版)