存储引擎_mysql存储引擎 - CSDN
精华内容
参与话题
  • 存储引擎

    2019-04-15 10:11:59
    存储引擎 1. 存储引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的 存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的...

    存储引擎


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

    2. 存储引擎的分类

    1. MyISAM: 拥有较高的插入,查询速度,但不支持事务
    2. InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定
    3. BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
    4. Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量正比的内存空间。并且其内容会在Mysql重新启动时丢失
    5. Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
    6. Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有效的插入速度,但其对查询的支持相对较差
    7. Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
    8. Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数量大,安全和性能要求高的应用
    9. CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。
    10. BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。

    3.MySQL中MyISAM与InnoDB区别

    1. 存储结构
      每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出件类型。 .frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI (MYIndex)。
    2. 存储空间
      MyISAM:可被压缩,存储空间较小。 InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小
    3. InnoDB:
      支持事务处理等
      不加锁读取
      支持外键
      支持行锁
      不支持FULLTEXT类型的索引
      不保存表的具体行数,扫描表来计算有多少行
      DELETE 表时,是一行一行的删除
      InnoDB 把数据和索引存放在表空间里面
      跨平台可直接拷贝使用
      InnoDB中必须包含AUTO_INCREMENT类型字段的索引
      表格很难被压缩
    4. MyISAM:
      不支持事务,回滚将造成不完全回滚,不具有原子性
      不支持外键
      不支持外键
      支持全文搜索
      保存表的具体行数,不带where时,直接返回保存的行数
      DELETE 表时,先drop表,然后重建表
      MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI(MYIndex)引伸
      跨平台很难直接拷贝
      MyISAM中可以使AUTO_INCREMENT类型字段建立联合索引
      表格可以被压缩
    5. 选择:
      因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。
      如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。
      两种类型都有自己优缺点,选择那个完全要看自己的实际类弄。
    展开全文
  • MySQL - 常见的三种数据库存储引擎

    万次阅读 多人点赞 2018-01-15 16:59:55
    数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的...

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

     

    查看存储引擎:

    我们可以用SHOW ENGINES; 来查询数据库的存储引擎。

     

    MySQL给用户提供了许多不同的存储引擎。在MySQL中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。Support列的值表示某种引擎是否能使用:YES表示可以使用、NO表示不能使用、DEFAULT表示该引擎为当前默认的存储引擎。

     

    我们也可以通过使用命令来查看数据库默认使用的引擎:SHOW VARIABLES LIKE 'storage_engine';

     

     

    下面来看一下其中几种常用的引擎。

     

    l InnoDB存储引擎

     

    InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),其它存储引擎都是非事务安全表,支持行锁定和外键,MySQL5.5以后默认使用InnoDB存储引擎。

     

    InnoDB主要特性

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

     

    InnoDB表的自动增长列可以手工插入,但是插入的如果是空或0,则实际插入到则是自动增长后到值。可以通过"ALTER TABLE...AUTO_INCREMENT=n;"语句强制设置自动增长值的起始值,默认为1,但是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。可以使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。如果一次插入多条记录,那么返回的是第一条记录使用的自动增长值。

    对于InnoDB表,自动增长列必须是索引。如果是组合索引,也必须是组合索引的第一列,但是对于MyISAM表,自动增长列可以是组合索引的其他列,这样插入记录后,自动增长列是按照组合索引到前面几列排序后递增的。

     

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引。在创建索引的时候,可以指定在删除、更新父表时,对子表进行的相应操作,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的情况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。

    当某个表被其它表创建了外键参照,那么该表对应的索引或主键被禁止删除。

    可以使用set foreign_key_checks=0;临时关闭外键约束,setforeign_key_checks=1;打开约束。

     

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

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

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

     

    l MyISAM存储引擎

     

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

     

    MyISAM主要特性:

     

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

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

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

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

    BLOB和TEXT列可以被索引。

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

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

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

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

    每个MyISAM表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置。MyISAM表还有一个标志用来表明该数据表在上次使用后是不是被正常的关闭了。如果服务器以为当机或崩溃,这个标志可以用来判断数据表是否需要检查和修复。如果想让这种检查自动进行,可以在启动服务器时使用--myisam-recover现象。这会让服务器在每次打开一个MyISAM数据表是自动检查数据表的标志并进行必要的修复处理。MyISAM类型的表可能会损坏,可以使用CHECK TABLE语句来检查MyISAM表的健康,并用REPAIR TABLE语句修复一个损坏到MyISAM表。

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

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

    VARCHAR和CHAR列可以多达64KB。

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

     

    MyISAM的表支持3种不同的存储格式:静态(固定长度)表,动态表,压缩表

     

     静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。

    动态表包含变长字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁到更新删除记录会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。

    压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

     

    l MEMORY存储引擎

     

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

     

    MEMORY主要特性:

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

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

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

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

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

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

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

     

    create table tab_memoryengine=memory select id,name,age,addr from man order by id;

     

    使用USING HASH/BTREE来指定特定到索引。

    create index mem_hash using hashon tab_memory(city_id);

     

    在启动MySQL服务的时候使用--init-file选项,把insert into...select或load data infile 这样的语句放入到这个文件中,就可以在服务启动时从持久稳固的数据源中装载表。

    每个MEMORY表中放置到数据量的大小,受到max_heap_table_size系统变量的约束,这个系统变量的初始值是16M,同时在创建MEMORY表时可以使用MAX_ROWS子句来指定表中的最大行数。

    每个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问非常快,因为它到数据是放在内存中的,并且默认使用HASH索引,但是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。 服务器需要足够的内存来维持所在的在同一时间使用的MEMORY表,当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行 DELETE FROM或 TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)。

     

    l 存储引擎的选择

     

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

     

    存储引擎的对比

    特性

    InnoDB

    MyISAM

    MEMORY

    事务安全

    支持

    存储限制

    64TB

    空间使用

    内存使用

    插入数据的速度

    对外键的支持

    支持

     

     

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

     

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

     

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

     

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

     

    若要修改默认引擎,可以修改配置文件中的default-storage-engine。可以通过:show variables like 'default_storage_engine';查看当前数据库到默认引擎。命令:show engines和show variables like 'have%'可以列出当前数据库所支持到引擎。其中Value显示为disabled的记录表示数据库支持此引擎,而在数据库启动时被禁用。在MySQL5.1以后,INFORMATION_SCHEMA数据库中存在一个ENGINES的表,它提供的信息与show engines;语句完全一样,可以使用下面语句来查询哪些存储引擎支持事物处理:select engine from information_chema.engines where transactions ='yes';

    可以通过engine关键字在创建或修改数据库时指定所使用到引擎。

    在创建表的时候通过engine=...或type=...来指定所要使用的引擎。show table status from DBname来查看指定表的引擎。

    展开全文
  • 1、Hash存储引擎代表数据库:redis、memcache等通常也常见于其他存储引擎的查找速度优化上。 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能...

    1、Hash存储引擎

    代表数据库:redis、memcache等

    通常也常见于其他存储引擎的查找速度优化上。 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端。

    这里列举缺点:

    (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
    (2)Hash 索引无法被用来避免数据的排序操作。
    (3)Hash 索引不能利用部分索引键查询。
    (4)Hash 索引在任何时候都不能避免表扫描。
    Hash碰撞,就是链式扫描:
    由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
    (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

    2、B树存储引擎

    代表数据库:MongoDB、mysql(基本上关系型数据库)等

    \

     

    还有一种算是B树存储引擎:COLA树(CacheObliviousBTree)

    代表数据库:tokudb

    为了如何让B树更有效的执行,他们提出了一个缓存忘却CacheOblivious算法,该算法在不需要明确知道存储器层次中数据传输规模的情况下,也可以高效的工作。更多请参见:https://en.wikipedia.org/wiki/Cache-oblivious_algorithm。

    说个大家熟悉的名称TokuMX : 目前非常流行的NoSQL数据库MongoDB的底层替换成与TokuDB同样的存储引擎[ ToKuMx],达到了非常好的效 果

    3、LSM树(Log-Structured Merge Tree)存储引擎

    代表数据库:nessDB、leveldb、hbase等

    核心思想的核心就是放弃部分读能力,换取写入的最大化能力。LSM Tree ,这个概念就是结构化合并树的意思,它的核心思路其实非常简单,就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在磁盘中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾(因为所有待排序的树都是有序的,可以通过合并排序的方式快速合并到一起)。

    日志结构的合并树(LSM-tree)是一种基于硬盘的数据结构,与B-tree相比,能显著地减少硬盘磁盘臂的开销,并能在较长的时间提供对文件的高速插入(删除)。然而LSM-tree在某些情况下,特别是在查询需要快速响应时性能不佳。通常LSM-tree适用于索引插入比检索更频繁的应用系统。Bigtable在提供Tablet服务时,使用GFS来存储日志和SSTable,而GFS的设计初衷就是希望通过添加新数据的方式而不是通过重写旧数据的方式来修改文件。而LSM-tree通过滚动合并和多页块的方法推迟和批量进行索引更新,充分利用内存来存储近期或常用数据以降低查找代价,利用硬盘来存储不常用数据以减少存储代价。

    磁盘的技术特性:对磁盘来说,能够最大化的发挥磁盘技术特性的使用方式是:一次性的读取或写入固定大小的一块数据,并尽可能的减少随机寻道这个操作的次数。

    \

     

    LSM和Btree差异就要在读性能和写性能进行舍和求。在牺牲的同事,寻找其他方案来弥补。

    1、LSM具有批量特性,存储延迟。当写读比例很大的时候(写比读多),LSM树相比于B树有更好的性能。因为随着insert操作,为了维护B树结构,节点分裂。读磁盘的随机读写概率会变大,性能会逐渐减弱。 多次单页随机写,变成一次多页随机写,复用了磁盘寻道时间,极大提升效率。

    2、B树的写入过程:对B树的写入过程是一次原位写入的过程,主要分为两个部分,首先是查找到对应的块的位置,然后将新数据写入到刚才查找到的数据块中,然后再查找到块所对应的磁盘物理位置,将数据写入去。当然,在内存比较充足的时候,因为B树的一部分可以被缓存在内存中,所以查找块的过程有一定概率可以在内存内完成,不过为了表述清晰,我们就假定内存很小,只够存一个B树块大小的数据吧。可以看到,在上面的模式中,需要两次随机寻道(一次查找,一次原位写),才能够完成一次数据的写入,代价还是很高的。

    3、LSM Tree放弃磁盘读性能来换取写的顺序性,似乎会认为读应该是大部分系统最应该保证的特性,所以用读换写似乎不是个好买卖。但别急,听我分析一下。

    a、内存的速度远超磁盘,1000倍以上。而读取的性能提升,主要还是依靠内存命中率而非磁盘读的次数

    b、写入不占用磁盘的io,读取就能获取更长时间的磁盘io使用权,从而也可以提升读取效率。例如LevelDb的SSTable虽然降低了了读的性能,但如果数据的读取命中率有保障的前提下,因为读取能够获得更多的磁盘io机会,因此读取性能基本没有降低,甚至还会有提升。而写入的性能则会获得较大幅度的提升,基本上是5~10倍左右。

    下面说说详细例子:

    LSM Tree弄了很多个小的有序结构,比如每m个数据,在内存里排序一次,下面100个数据,再排序一次……这样依次做下去,我就可以获得N/m个有序的小的有序结构。

    在查询的时候,因为不知道这个数据到底是在哪里,所以就从最新的一个小的有序结构里做二分查找,找得到就返回,找不到就继续找下一个小有序结构,一直到找到为止。

     

    很容易可以看出,这样的模式,读取的时间复杂度是(N/m)*log2N 。读取效率是会下降的。

    这就是最本来意义上的LSM tree的思路。那么这样做,性能还是比较慢的,于是需要再做些事情来提升,怎么做才好呢?

    LSM Tree优化方式:

    a、Bloom filter: 就是个带随即概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定的那个数据的。于是就可以不用二分查找,而只需简单的计算几次就能知道数据是否在某个小集合里啦。效率得到了提升,但付出的是空间代价。

    b、compact:小树合并为大树:因为小树他性能有问题,所以要有个进程不断地将小树合并到大树上,这样大部分的老数据查询也可以直接使用log2N的方式找到,不需要再进行(N/m)*log2n的查询了


    展开全文
  • 通常情况下我们会把数据库和数据库管理系统笼统的称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统。 MySQL是一种关系数据库管理系统,关系数据库将数据...

         数据库(DataBase)是存放用户数据的地方,当用户访问、操作数据库中的数据时,需要数据库管理系统的帮助。数据管理系统的全称是DataBase Management System,简称DBMS。通常情况下我们会把数据库和数据库管理系统笼统的称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统。

         MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL使用 C和 C++编写,其体积小、速度快、源码开放,如今被应用在大量的中小型应用上。

    1.MySQL架构

                          

    上图为MySQL的逻辑架构图:

    支持接口是第三方语言对数据库的操作接口,这里不再赘述。

    1)连接层

         最上层的连接池是一些连接服务,包含本地sock通信和大多数基于C/S工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全连接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

    2)服务层

         第二层架构主要完成大多数的核心服务功能,如SQL接口、缓存的查询、SQL的分析和优化、内置函数等。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在频繁读操作的环境中能够很好的提升系统的性能。

    3)引擎层

         存储引擎真正的负责MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信,不同的存储引擎具有的特性不同,我们可以根据实际需进行选取。下文将对相关存储引擎进行具体介绍。

    4)存储层

        数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

    SQL的执行过程:数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL,由MySQL处理并返回执行结果。首先,其它编程语言通过SQL支持接口调用MySQL,MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理。当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询:由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构。解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行。确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回。

    2.MySQL的存储引擎

    MySQL在5.1版本之前默认存储引擎为MyISAM,在此版本之后为InnoDB。

    1)MyISAM存储引擎

         MyIsam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。MyIsam 只支持表锁,不支持事务。MyIsam 由于有单独的索引文件,在读取数据方面的性能很高。Myisam是以堆结构进行组织数据,其表容易损坏。

    2)InnoDB

         InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。InnoDB 中存在表锁和行锁,不过行锁是在命中索引的情况下才会起作用。InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读。

    两种存储引擎的对比:从MyISAM和InnoDB的存储文件可看出,MyISAM注重的是对数据的快速读取,但由于MyISAM不支持事务,同时缺乏灵活性。而InnoDB支持事务和行级锁,因此在5.1之后MySQL的默认存储引擎为InnoDB。

    3)两大存储引擎的数据结构

         MyISAM和InnoDB两种存储引擎都采用了B+树(有关B+树的概念和由来,请见笔者相关博客)的数据结构,但具体实现方式完全不同。

         MyISAM的B+树实现示例图:

                                    

        MyISAM的B+树叶子节点存储的并不是数据,而是数据地址,因此也称为非聚集索引,搜索按照B+树的搜索算法进行。

     

        InnnDB的B+树实现示例图:

                                   

        InnoDB的B+树叶子节点存储的就是数据本身,因此也称为聚集索引。从实现数据结构可知,如采用InnoDB存储引擎,不宜设置过长的主键。另外,使用InnoDB尽量采用自增(自减)的数据为主键,否则,由于叶子结点处直接存储数据的原因(数据即为索引),会造成频繁的B+的分裂合并调整,效率十分低下。从数据结构的实现看出,当读写更新比较频繁,读写一致性要求很高的业务,采用InnoDB更佳。

    展开全文
  • mysql存储引擎

    万次阅读 多人点赞 2019-07-31 19:28:44
    数据库存储引擎 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还...
  • MySQL存储引擎的区别与比较

    万次阅读 2019-03-18 14:56:20
    存储引擎,即表类型(table_type) 用户可以根据应用的需求选择如何来存储数据、索引、是否使用事务等。选择合适的存储引擎往往能够有效的提高数据库的性能和数据的访问效率,另外一个数据库中的多个表可以使用不同...
  • 哈希存储引擎 B树存储引擎 LSM树存储引擎 并发控制 存储快照实现原理
  • MySQL存储引擎

    千次阅读 2018-09-30 22:03:34
    数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用存储引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定...
  • MySQL数据库的存储引擎

    千次阅读 2019-06-04 21:27:15
    文章目录存储引擎概念MySQL常用的存储引擎用来区分各种存储引擎的核心功能常用存储引擎优缺点存储器的选择修改数据库默认引擎 存储引擎概念 Mysql中的数据用各种不同的技术存储在文件或者内存中,每一种技术都使用...
  • MongoDB存储引擎选择

    万次阅读 2017-08-09 10:41:21
    MongoDB存储引擎选择
  • MYSQL简介和存储引擎的选择

    千次阅读 2015-11-16 10:45:32
    MYSQL简介和存储引擎的选择 1.MYSQL  MYSQL本质上是一种KEY-VALUE结构的关系型数据,不过这么讲可能比较笼统,在这里用MYSQL逻辑架构图来做一下详细的 说明。   (1) 客户端  MYSQL同大多数服务一样,拥有客户端...
  • MySQL数据库存储引擎详解

    千次阅读 2012-10-26 10:32:54
     我们通常说的MySql数据库,sql server数据库等等其实是数据库管理系统,它们可以存储数据,并提供查询和更新数据库中的数据的功能等等。根据数据库如何存储数据和如何操作数据的实现机制不同,这些数据库之间即有...
  • MySQL - 常用存储引擎区别总结(2020最新版)

    万次阅读 多人点赞 2020-08-05 17:26:01
    存储引擎是数据库的核心,在MySQL中,存储引擎是以插件的形式运行的。支持的引擎有十几种之多,但我们实战常用到的,大概只有InnoDB、MyISAM 和 Memory 了。术业有专攻,这三种引擎各有特点和适用场景,也算是各自的...
  • MySQL表存储引擎

    千次阅读 2013-04-30 17:56:21
    MySQL的强大之处在于它的插件式存储引擎,我们可以基于表的特点使用不同的存储引擎,从而达到最好的性能。 下面我们来认识一下MySQL各表存储引擎的特点: InnoDB存储引擎 特点: 1,支持事务,主要面向在线事务...
  • 什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Server等数据库中只有一种存储...
  • MySQL 存储过程和存储引擎

    千次阅读 2015-07-17 17:36:06
    1. 存储过程存储过程是 SQL 语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
  • 前段时间找工作所以看了《Mysql技术内幕InnoDB存储引擎》,整理的时候除了参考网上已有的笔记贴,加上自己整合的,可能和别人有雷同之处。不过无所谓啦,写出来自己看看,需要的朋友参考下,仅此而已。 一....
  • MySQL的存储引擎

    千次阅读 2019-12-28 21:09:38
    CSV存储引擎 Archive(档案)存储引擎 Memory存储引擎 MyISAM存储引擎 InnoDB存储引擎 InnoDB与MyISAM的比较 什么是引擎? 引擎(Engine)是电子平台上开发程序或系统的核心组件。利用引擎,开发者可迅速...
  • MySQL服务与存储引擎间的接口

    千次阅读 2017-06-28 15:09:24
    MySQL定义了一系列抽象存储引擎API,以支持插件式存储引擎架构。在历史版本中,这些接口被为"table handler"。我们这里所说的存储引擎(Storage Engine),是指数据的存储/读取相关的逻辑模块。而存储引擎API...
  • 为后续可以清楚的理解MySQL体系结构中的存储引擎,这里先介绍清楚数据库和数据库实例这两个概念 数据库:文件的集合,依照某种数据模型组织起来,并存放于二级存储器(硬盘)中的数据集合 数据库实例:应用程序,...
1 2 3 4 5 ... 20
收藏数 476,726
精华内容 190,690
关键字:

存储引擎