MySQL中常用的存储引擎(MyISAM 和InnoDB)

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

使用 SHOW ENGINES; 命令查看MySQL支持的存储引擎,  Support 列表示某种引擎是否可以使用,YES表示可以,NO表示不可以,DEFAULT表示当前默认存储引擎。

mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                          | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | Stores tables as CSV files                                                       | NO           | NO   | NO         |
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                            | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                        | NO           | NO   | NO         |
| MyISAM             | YES     | Non-transactional engine with good performance and small data footprint          | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                   | YES          | NO   | YES        |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES          | YES  | YES        |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                           | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                               | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.01 sec)

InnoDB存储引擎:

InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID[automiocity:原子性, consistency: 一致性, isolation: 隔离性, durability: 持久性]),支持锁定和外键(保证数据的一致性和完整性), 具有从服务崩溃中恢复的能力, 能够最大限度的保护数据。支持行级锁(可以提升多用户并发时的读写性能)

特点:     1. InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。   这些功能增加了用户部署和性能,甚至在同一个查询中也可以混合。
  2. InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
  3. InnoDB存储引擎完全与MySQL服务器整合,它为在主内存中缓存数据和索引而维持自己的缓冲池。InnoDB将它的表和索引存在一个逻辑空间中,表空间可以包含数个文件。
  4. InnoDB支持外键完整性约束
  5. InnoDB被用在众多需要高性能的大型数据库站点上。

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

7. InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。

    这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上

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

     并以此作为主键


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

  

  设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度保护用户的数据
  支持行级锁,可以提升多用户并发时的读写性能
  支持外键,保证数据的一致性和完整性
  InnoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中
  对于INSERT、UPDATE、DELETE操作,InnoDB会使用一种change buffering的机制来自动优化,还可以提供一致性的读,并且还能够缓存变更的数据,减少磁盘I/O,提高性能
  创建InnoDB表之后会产生两个文件
    .frm表结构文件
    .ibd,数据和索引存储表空间中
  所有的表都需要创建主键,最好是配合上AUTO_INCREMENT,也可以放到经常查询的列作为主键

  InnoDB的查询效率低于MyISAM

MyISAM存储引擎

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

特点:

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

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

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

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

  5. BLOB和TEXT列可以被索引

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

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

  8. 每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。

   所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快

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

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

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

  12. VARCHAR和CHAR列可以多达64KB

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

MyISAM存储引擎
  默认MyISAM的表会在磁盘中产生3个文件
    .frm: 表结构文件
    .MYD: 数据文件

    .MYI: 索引文件
  可以在创建的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持
    DATA DIRECORY [=] 数据保存的绝对路径
    INDEX DIRECTORY [=] 索引文件保存的绝对路径
    MyISAM单表最大支持的数据量2的64次方条记录
  每个表最多可以建立64个索引
  如果是复合索引,每个复合索引最多包含16个列,索引值最大长度是1000B
  MyISAM引擎的存储格式
    定长(FIXED 静态):  是指字段中不包含VARCHAR/TEXT/BLOB
    动态(DYNAMIC): 只要字段中包含了VARCHAR/TEXT/BLOB
    压缩(COMPRESSED): myisampack创建

--测试MyISAM存储引擎

mysql> CREATE TABLE myisam_1(
    -> a CHAR(30),
    -> id INT
    -> )ENGINE=MyISAM;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE TABLE myisam;
ERROR 1146 (42S02): Table ‘test.myisam‘ doesn‘t exist
mysql> SHOW CREATE TABLE myisam_1;
+----------+---------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                              |
+----------+---------------------------------------------------------------------------------------------------------------------------+
| myisam_1 | CREATE TABLE `myisam_1` (
  `a` char(30) DEFAULT NULL,
  `id` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |
+----------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> SHOW TABLE STATUS LIKE ‘myisam_1‘\G;
*************************** 1. row ***************************
            Name: myisam_1
          Engine: MyISAM
         Version: 10
      Row_format: Fixed---------------<-----------定长(FIXED 静态), 是指字段中不包含VARCHAR/TEXT/BLOB
            Rows: 0
  Avg_row_length: 0
     Data_length: 0
 Max_data_length: 9851624184872959
    Index_length: 1024
       Data_free: 0
  Auto_increment: NULL
     Create_time: 2019-09-21 14:40:44
     Update_time: 2019-09-21 14:40:44
      Check_time: NULL
       Collation: latin1_swedish_ci
        Checksum: NULL
  Create_options:
         Comment:
Max_index_length: 17179868160
       Temporary: N
1 row in set (0.01 sec)
 1 mysql> CREATE TABLE myisam_2(
 2     -> a VARCHAR(30),
 3     -> id INT
 4     -> )ENGINE=MyISAM;
 5 Query OK, 0 rows affected (0.01 sec)
 6
 7 mysql> SHOW TABLE STATUS LIKE ‘myisam_2‘\G;
 8 *************************** 1. row ***************************
 9             Name: myisam_2
10           Engine: MyISAM
11          Version: 10
12       Row_format: Dynamic-------------------<----------------动态(DYNAMIC),只要字段中包含了VARCHAR/TEXT/BLOB
13             Rows: 0                          动态表处理数据要复杂, 因为动态表在查询和存储数据时在每行有一个行头来标识这一行记录的长度
14   Avg_row_length: 0                          若经常更新表的话, 会产生很多的碎片, (可以用optimize table进行优化)
15      Data_length: 0
16  Max_data_length: 281474976710655
17     Index_length: 1024
18        Data_free: 0
19   Auto_increment: NULL
20      Create_time: 2019-09-21 14:51:40
21      Update_time: 2019-09-21 14:51:40
22       Check_time: NULL
23        Collation: latin1_swedish_ci
24         Checksum: NULL
25   Create_options:
26          Comment:
27 Max_index_length: 17179868160
28        Temporary: N
29 1 row in set (0.00 sec)

--通过 ROW_FORMAT=FIXED 设置包含有VARCHAR等属性的字段为(Dynamic-->Fixed), 静态的查找速度较快, 因为每一行的值得长度是固定的(若有索引, 可以根据   行号*固定长度=精确位置   来实现快速查找)
CREATE TABLE myisam_3(
a VARCHAR(30),
id INT
)ENGINE=MyISAM ROW_FORMAT=FIXED DEFAULT CHARSET=UTF8;

mysql> CREATE TABLE myisam_3(
    -> a VARCHAR(30),
    -> id INT
    -> )ENGINE=MyISAM ROW_FORMAT=FIXED DEFAULT CHARSET=UTF8;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW TABLE STATUS ‘myisam_3‘\G;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘‘myisam_3‘‘ at line 1
ERROR:
No query specified

mysql> SHOW TABLE STATUS LIKE ‘myisam_3‘\G;
*************************** 1. row ***************************
            Name: myisam_3
          Engine: MyISAM
         Version: 10
      Row_format: Fixed
            Rows: 0
  Avg_row_length: 0
     Data_length: 0
 Max_data_length: 27021597764222975
    Index_length: 1024
       Data_free: 0
  Auto_increment: NULL
     Create_time: 2019-09-21 15:02:58
     Update_time: 2019-09-21 15:02:58
      Check_time: NULL
       Collation: utf8_general_ci
        Checksum: NULL
  Create_options: row_format=FIXED
         Comment:
Max_index_length: 17179868160
       Temporary: N
1 row in set (0.00 sec)

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,因为支持事务的提交(commit)和回滚(rollback)。

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

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

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

---------------------------------------------------------------------------------------------------------------------------------------------------------

MySQL架构总共四层,在上图中以虚线作为划分。 
  首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。 
  第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数学和加密函数)。

    同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

  第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。

    存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),

    不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。

  第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。

原文地址:https://www.cnblogs.com/iceliu/p/11563403.html

时间: 2024-10-03 22:40:31

MySQL中常用的存储引擎(MyISAM 和InnoDB)的相关文章

MySQL存储引擎 - Myisam和Innodb

Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 展名为.MYD (MYData).索引文件的扩 展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISA

MySQL存储引擎MyISAM和InnoDB

MySQL存储引擎MyISAM和InnoDB 存储引擎 在MySQL中的数据拥有各种不同的技术存储文件或内存中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不用的功能和能力.通过选择不同的技术,能够获得额外的速度或者功能,从而改善应用的整体功能.这些不同的技术以及配套的相关功能在MySQL中被称之为存储引擎. MyISAM存储引擎 MyISAM存储引擎是MySQL关系数据库系统5.5版本之前默认的存储引擎. 特点 1.不支持事务 2.表级锁定形式,数据在更新时

MySQL索引与事务、存储引擎MyISAM和InnoDB (理论+实践篇)

索引的概念 数据库中的索引与书籍中的目录类似 在一本书中,无须阅读整本书,利用目录就可以快速查找所需信息 书中的目录是一个词语列表,其中注明了包含各个词的页码 数据库索引 在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据 数据库中的索引|是某个表中一-列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单 索引的的作用 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成3 F

解析MySQL的体系架构及学习Mysql存储引擎MyISAM和InnoDB

mysql体系结构: 由:连接池组件.管理服务和工具组件.sql接口组件.查询分析器组件.优化器组件. 缓冲组件.插件式存储引擎.物理文件组成.mysql是独有的插件式体系结构,各个存储引擎有自己的特点. mysql各个存储引擎概述: (1) innodb存储引擎:[/color][/b] 面向oltp(online transaction processing).行锁.支持外键.非锁定读.默认采用repeaable级别(可重复读)通过next-keylocking策略避免幻读.插入缓冲.二次写

MySQL存储引擎MyISAM与InnoDB的优劣

使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都会看到. MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB了. 至于到底用哪种存储引擎比较好?这个问题是没有定论的,需要根据你的需求和环境来衡量.所以对这两种引擎的概念.原理.异同和各自的优劣点有了详细的了解之后,再根据自己的情况选择起来就容易多了. MyISAM InnoDB 存储结构 每张表被存放在三个文件: frm-表格定义 MYD(MYData)-数据文件 MYI(MYIndex)-索引文件

Mysql存储引擎MyIsAM和InnoDB区别

Mysql 数据库中,最常用的两种引擎是innordb 和myisam.InnoDB 是Mysql 的默认存储引擎. 两者的区别: 1.事务处理上方面MyISAM:强调的是性能,查询的速度比InnoDB 类型更快,但是不提供事务支持.InnoDB:提供事务支持. 2.外键MyISAM:不支持外键, InnoDB:支持外键. 3.锁MyISAM:只支持表级锁, InnoDB:支持行级锁和表级锁,默认是行级锁,行锁大幅度提高了多用户并发操作的性能.innodb 比较适合于插入和更新操作比较多的情况,

Mysql 的存储引擎,myisam和innodb的区别

MyISAM 是非事务的存储引擎,innodb是支持事务的存储引擎. innodb的引擎比较适合于插入和更新操作比较多的应用,而MyISAM 则适合用于频繁查询的应用 . MyISAM --表锁,innodb--设计合理的话是行锁,MyISAM 不会出现死锁. 最大的区别就是MYISAM适合小数据,小并发:INNODB 适合大数据,大并发.最大的区别就是在锁的级别上. MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持. MyISAM类型的表强调的是性能,其执行数度比InnoDB类

MySQL中merge表存储引擎用法

在Mysql数据库中,Merge表有点类似于视图.mysql的merge引擎类型允许你把许多结构相同的表合并为一个表.之后,你可以执行查询,从多个表返回的结果就像从一个表返回的结果一样.每一个合并的表必须有完全相同表的定义和结构. Mysql Merge表的优点:A. 分离静态的和动态的数据B. 利用结构接近的的数据来优化查询C. 查询时可以访问更少的数据D. 更容易维护大数据集E. 可以通过修改.mrg文件来修改Merge表,当然也可以用alter进行修改,修改后要通过FLUSH TABLES

mysql中常见的存储引擎和索引类型

存储引擎 1.      定义 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型). 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的.而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎. 2.      存储引擎的类型及特点