MySQL五大引擎之间的区别和优劣之分

news/2025/2/26 4:45:17

MyISAM:

创建一个myisam存储引擎的表的时候回出现三个文件

1.tb_demo.frm,存储表定义;  2.tb_demo.MYD,存储数据;  3.tb_demo.MYI,存储索引。

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。

MyISAM存储引擎特别适合在以下几种情况下使用:

1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。

2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。

 

InnoDB:

InnoDB是一个健壮的事务型存储引擎MySQL 5.6.版本以后InnoDB就是作为默认的存储引擎。

InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

1. 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。

2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。

3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。

4.外键约束。MySQL支持外键的存储引擎只有InnoDB。

5.支持自动增加列AUTO_INCREMENT属性。

 

MEMORY:

使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

一般在以下几种情况下使用Memory存储引擎:

1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。

2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。

3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中

 

MERGE:

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。Merge存储引擎的使用场景。对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。

 

ARCHIVE:

rchive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。

 

比较常用的是MyISAM和InnoBD

   MyISAM  InnoDB 
  构成上的区别:  每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。

  .frm文件存储表定义。

  数据文件的扩展名为.MYD (MYData)。

  索引文件的扩展名是.MYI (MYIndex)。
  基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB
  事务处理上方面:   MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能
SELECT   UPDATE,
INSERT,Delete操作
 
 如果执行大量的SELECT,MyISAM是更好的选择1.如果你的数据执行大量的INSERT  UPDATE,出于性能方面的考虑,应该使用InnoDB表

  2.DELETE   FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

  3.LOAD   TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用
  对AUTO_INCREMENT
的操作
 
 每表一个AUTO_INCREMEN列的内部处理。

  MyISAM  INSERT  UPDATE 操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。

  AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置

  对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引

  更好和更快的auto_increment处理
  如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。

  自动增长计数器仅被存储在主内存中,而不是存在磁盘上

  关于该计算器的算法实现,请参考

  AUTO_INCREMENT 列在 InnoDB 里如何工作 
表的具体行数  select count(*) from table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含  where条件时,两种表的操作是一样的 InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行
   表锁提供行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
   SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表, 例如update table set num=1 where name like “�a%”

转载于:https://www.cnblogs.com/psyu/p/10883332.html


http://www.niftyadmin.cn/n/1933742.html

相关文章

物联网信息泄露又一例!家用智能设备还安全吗?

今年圣诞节&#xff0c;很多人在他们的树下或袜子里找到了全新的Wyze监控摄像头。但在为收到礼物而开心的同时&#xff0c;别忘了该公司在圣诞节为每个使用其产品的人带来了一个大麻烦。据证实&#xff0c;Wyze摄像头数据泄露事件确有发生&#xff0c;该事件可能在几周时间里暴…

Python(67)_写函数,判断用户传入的对象(str,列表,元组)的每一个元素是否有为空,并返回...

#-*-coding:utf-8-*-写函数&#xff0c;判断用户传入的对象(str&#xff0c;列表&#xff0c;元组)的每一个元素是否有为空&#xff0c;并返回def func(x):strif type(x) is str and x:for i in x:if i :return Trueelif x and type(x) is list or type(x) is tuple:for i in…

苏宁安全架构演进及实践

近年来&#xff0c;各类网络安全事件层出不穷&#xff0c;木马病毒、信息泄漏、网络诈骗等等字眼时常见诸媒体&#xff0c;就连年初美国的总统大选都被黑客闹得鸡飞狗跳&#xff0c;网络安全从未像今天这样受到整个社会的重视&#xff0c;那么对于绝大部分互联网企业尤其是电商…

JAVA静态代码块的作用

一 般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情 况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接…

后台服务器的测试

一、 from flask import Flask,Response,requestappFlask(__name__,static_folderstatic)app.route(/)def index():return var a"hellow"app.route(/allow,methods[get,post])def allow():headers{Access-Control-Allow-Origin:*,Access-Control-Allow-Content-Type:…

$ZOJ\ 2432\ Greatest\ Common\ Increasing\ Subsequence$

传送门 $Description$ 求两个序列的最长公共上升子序列 $Solution$ $f[i][j]$表示$a$序列匹配到$i$和$b$序列匹配到$j$的最长上升序列的长度&#xff0c;这里并不要求$a[i]b[j]$。 两层循环&#xff0c;外层$i1...n1$,内层$j1...n2$ 转移&#xff1a; $f[i][j]max(f[i-1][1...j…

玩转GO语言之文件读写操作

1.文件的打开,关闭//1.打开文件 fp, err : os.Open("/Users/yangtao/go_lesson/test.txt") if err ! nil {fmt.Println("打开失败") }else {fmt.Println("打开成功")fmt.Println(fp) }//2.关闭文件 defer func() {if err : fp.Close(); err ! ni…

Nginx的常用配置功能

资源的访问控制1.用户访问验证模块ngx_http_auth_basic_module模块可以实现让访问者&#xff0c;在访问某些特定资源时&#xff0c;只有输入正确的用户密码才允许访问web内容web上的一些内容不想被其他人知道&#xff0c;但是又想让部分人看到。nginx的http_auth模块以及Apache…