网站首页 > 基础教程 正文
一、MySQL的四种常见引擎介绍:
(1):MyISAM存储引擎(适用于热备份库,或者作为读写分离的从库)
不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表。
支持3种不同的存储格式,分别是:静态表;动态表;压缩表
- 静态表(静态型):表中的字段都是非变长字段,这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照列的宽度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
- 动态表(动态型):记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能
- 压缩表(压缩型):因为每个记录是被单独压缩的,所以只有非常小的访问开支
MyISAM采用的索引为B+树索引。(B+树:平衡多叉树。总的有:二叉树、平衡二叉树、平衡多叉树、B+树)
(2):InnoDB存储引擎(常用于主库,动态交互的写库)
该存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
- InnoDB存储引擎总支持AUTO_INCREMENT。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键。在插入值的时候,如果自动增长列不输入值,则插入的值为自动增长后的值;如果输入的值为0或空(NULL),则插入的值也是自动增长后的值;如果插入某个确定的值,且该值在前面没有出现过,就可以直接插入。
- InnoDB还支持外键(FOREIGN KEY)。外键所在的表叫做子表,外键所依赖(REFERENCES)的表叫做父表。父表中被字表外键关联的字段必须为主键。当删除、更新父表中的某条信息时,子表也必须有相应的改变,这是数据库的参照完整性规则。
- InnoDB中,创建的表的表结构存储在.frm文件中。
InnoDB采用的索引为B+树索引。
InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。
(3):MEMORY存储引擎
Memory存储引擎使用存在于内存中的内容来创建表。每个memory表只实际对应一个磁盘文件,格式是.frm。memory类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用HASH索引,但是一旦服务关闭,表中的数据就会丢失掉。
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引(默认索引),两种不同类型的索引有其不同的使用范围
- Hash索引优点:Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
- Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
Memory类型的存储引擎主要用于哪些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地对中间结果进行分析并得到最终的统计结果。对存储引擎为memory的表进行更新操作要谨慎,因为数据并没有实际写入到磁盘中,所以一定要对下次重新启动服务后如何获得这些修改后的数据有所考虑。
(4):MERGE存储引擎
Merge存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
查看存储引擎的命令:show engines;
Engine Support Comment Transactions XA Savepoints
InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES
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
BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO
MyISAM YES MyISAM storage engine NO NO NO
CSV YES CSV storage engine NO NO NO
ARCHIVE YES Archive storage engine NO NO NO
PERFORMANCE_SCHEMA YES Performance Schema NO NO NO
FEDERATED NO Federated MySQL storage engine NULL NULL NULL
二、MyISAM索引与InnoDB索引的区别
MyISAM的索引方式是非聚簇的(没有聚簇索引,所有的索引都理解为二级索引),和InnoDB中包含1个聚簇索引是不同的。
在MyISAM中,主键索引和二级索引在结构上没有区别,只是主键索引要求key是唯一的,而二级索引的key可以重复。
1、InnoDB要求表必须有主键,而MyISAM可以没有。
2、InnoDB的非聚簇索引data域存储相应记录主键的值,而MyISAM索引记录的是地址。
3、在InnoDB中,只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在MyISAM中需要进行一次回表操作,表示MyISAM中建立的索引都是二级索引。
4、InnoDB的数据文件就是索引文件(结构、数据和索引可以被保存在一个文件中,这个文件操作系统不限制大小),而MyISAM的结构文件、索引文件和数据文件是分离的。
InnoDB表数据可以保存在多个文件中,每一个文件限制2G。
如果系统中一张表记录数据量达到一个亿,那么一定要分成多个文件保存聚族索引,根据分页技术保存。
因为innodb数据库引擎下,一张表,根据id字段建立一个聚族索引,是一棵b+tree,叶子结点是索引和记录数据!记录就是跟索引在一块保存,所以不再有数据文件。建立在其他字段上的非聚族索引,是一颗b+tree,叶子结点是索引和记录id。
MyISAM的表存储成3个文件。文件的名字与表名相同。拓展名为frm、MYD、MYI。
.frm文件:存储表的结构
.MYD文件:存储数据
.MYI文件:存储索引
myisam数据库引擎下,一张表,根据id字段建立的是非聚族索引,是一棵b+tree,叶子节点是索引和记录数据的地址。记录与索引保存在不用文件中。建立在其他字段上的索引是非聚族索引,叶子节点是索引和记录数据的地址。
5、MyISAM的回表操作是十分快速的,主要是拿地址偏移量直接到文件中取数据。
myisam对于查询速度更快,因为文件较小,找到地址后,直接命中地址
indnnodb对于不是id=?这种的查询慢,因为文件较大,查询到id后还要查询聚族索引数树。而还是在这个文件里,可能有多个文件。
三、MyISAM索引与InnoDB索引的检索算法:
1、在MyISAM中索引检索的算法为:
MyISAM索引文件(.MYI)和数据文件(.MYD)是分离的,索引文件仅保存数据记录的地址。
索引文件仅保存记录所在页的指针(物理位置),通过这些地址来读取页,进而读取被索引的行。
- 按照B+树搜索算法搜索索引,如果指定的key存在,则取出其data域的值
- 以data域的值为地址,在数据文件中读取相应的数据记录。
MyISAM的二级索引跟主键索引实现方式相同,都是保存数据的地址。
2、在InnoDB中索引检索的算法为:
①、聚集索引(主键索引):
InnoDB 存储引擎采用“聚集索引”的数据存储方式实现B+Tree索引,所谓“聚集”,就是指数据行和相邻的键值紧凑地存储在一起。
在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。
这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
②、非聚集索引(二级索引):
而对于二级索引,InnoDB采用的方式是在叶子中保存主键值,通过这个主键值来回表(上图)查询到一条完整记录,因此按辅助索引检索实际上进行了二次查询。
猜你喜欢
- 2024-10-12 数据库笔试面试25——有关InnoDB和MyISAM的说法中
- 2024-10-12 Mysql中的InnoDB和MyISAM|每天一面试题
- 2024-10-12 数据库常见面试题:InnoDB和MySIAM的区别-开课吧
- 2024-10-12 记一次生产数据库MyISAM存储引擎转为Innodb过程
- 2024-10-12 InnoDB 和 MyISAM的数据分布是什么样的?
- 2024-10-12 程序员冷知识,Mysql的数据库引擎为什么多选InnoDB?
- 2024-10-12 MySQL之MyISAM索引和InnoDB索引的实现细节
- 2024-10-12 MyISAM 和 InnoDB 实现 B 树索引方式的区别是什么?
- 2024-10-12 MyISAM 与 InnoDB 索引的区别有哪些?
- 2024-10-12 mysql-innodb和myisam存储引擎 mysql的两种存储引擎区别,各自的使用场景
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)