存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种。
数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。
当面试官问道如何优化数据库的时候还在回答添加索引和分库分表?
那么恭喜你,上一个来面试的小伙伴也是这么说的。
数据库中不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,不同的存储引擎有着不同的特性,无从判断熟弱熟强,因为它们在各自适合的应用场景下都有着自己不可撼动的地位,了解这些存储引擎的不同特性才能设计出更合理高效的数据库。
MySQL 支持多种类型的数据库引擎,可分别根据各个引擎的功能和特性为不同的数据库处理任务提供各自不同的适应性和灵活性。
MySQL中的存储引擎有:InnoDB、MyISAM、MRG_MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE、PERFORMANCE_SCHEMA、FEDERATED 等
其中最为常用的有:InnoDB、MyISAM、Memory、Archive
可以通过 SHOW ENGINES 语句来显示可用的数据库引擎和默认引擎。
博主的MySQL版本是5.7 。如图可见默认使用的存储引擎是InnoDB
(MySQL5.1.X之前的版本中,默认的存储引擎是MyISAM。MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎)
终于讲到正题,并不是故意扯那么多,而是这些最好都要知道,如果是直接空降过来的建议从头开始看起,当然,有一定数据库存储引擎功底的小伙伴除外。
在这只讲较为常用的几种存储引擎,虽然MySQL支持的存储引擎非常多,但常用的也就这么几种。
InnoDB,是MySQL的数据库引擎之一,现为MySQL的默认存储引擎。
InnoDB是为处理巨大数据量时的最大性能而设计,InnoDB支持事务能够保证高并发下数据的安全性和一致性,支持表锁和行锁(只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁),能够在高并发的情况下大大提升数据库的效率。
(如果还有不了解事务的小伙伴可以点击传送门翻阅博主之前数据库事务的相关文章)
InnoDB一定会有主键(如果不声明主键,程序会自动生成一个隐式字段作为主键)
InnoDB底层采用B+树来进行数据存储。MySQL innodb的主键索引是簇集索引,也就是索引的叶子节点存的是整个单条记录的所有字段值,不是主键索引的就是非簇集索引也称辅助索引,非簇集索引的叶子节点存的是主键字段的值。
回表是什么意思?
就是你执行一条sql语句,需要从两个b+索引中去取数据。举个例子:
表tbl有a,b,c三个字段,其中a是主键,b上建了索引,然后编写sql语句SELECT * FROM tbl WHERE a=1
这样不会产生回表,因为所有的数据在a的索引树中均能找到
而SELECT * FROM tbl WHERE b=1
这样就会产生回表,因为where条件是b字段,那么会去b的索引树里查找数据,但b的索引里面只有a,b两个字段的值,没有c,那么这个查询为了取到c字段,就要取出主键a的值,然后去a的索引树去找c字段的数据。查了两个索引树,这就叫回表。
Innodb的辅助索引存储的是主键值而不存数据所在的地址,需要通过主键值进行回表才能找到数据所在的内存地址
MyISAM是MySQL5.5版之前的默认数据库引擎,由早期的ISAM所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,随着业务的逻辑越来越复杂,对安全性与效率方面要求越来越高,MySQL也导入了InnoDB(另一种数据库引擎),以强化参照完整性与并发违规处理机制,后来就逐渐取代MyISAM。
MyISAM不支持事务,支持表锁,其安全方面与并发效率方面远不如InnoDB,但myism中b+树的叶子节点存储的是数据的内存地址,因此不需要进行回表,所有有读取更快的说法。
MEMORY是MySQL中一类非常特殊的存储引擎,与MySQL中其他的存储引擎不同的是MEMORY存储引擎是通过内存来进行存储的只支持表级锁,表级锁会成为MEMORY存储引擎的瓶颈。其它优点和缺点都非常明显。因为是通过内存来进行存储的,所以他的效率要远远高于其他存储引擎,也就是因为通过内存来进行存储,所以数据容易受到崩溃,硬件问题或断电的影响而导致全部数据丢失,因此只能将这些表用作临时工作区或从其他表中提取数据的只读缓存,或存储一些不怎么重要与可再生的数据。
ARCHIVE比较特别,这个引擎只允许插入和查询,不允许修改和删除。相当于拥有只读权限和写入权限,没有修改权限和删除权限。
ARCHIVE在存储的时候会对数据进行压缩,可能别的存储引擎几个G的数据,用ARCHIVE只需要几百兆就能存下。比较适合用来做日志记录等操作。
1、Innodb引擎(Mysql的默认引擎):Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统,相比MyIASM引擎,Innodb修改快、支持事务、支持行锁,并发效率高,但插入、查询操作不如MyIASM。各有各的优点。
2、MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键,对比InnoDB引擎,MyIASM插入快、查询快,但并发效率和安全性不及InnoDB。各有各的特长。
3、MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高,断电则数据全部丢失。
4、ARCHIVE引擎:对数据进行压缩,只允许插入和查询操作,不允许修改和删除
目录 读者基础 ?微服务架构梳理 https://www.coder4.com/homs_online/ ? ? 读者...
这5个PHP编程中的不良习惯,一定要改掉 PHP世界上最好的语言! 测试循环前数组是...
MFC项目在vs2017编译正常无报错,但是升级vs2019后一打开项目就报如下错误。 项...
在大三的时候,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了...
今天看到个不错的网页播放器,感觉不错,大家可以测试 我写的一个播放器网页: ...
本文实例为大家分享了vue实现按钮切换图片的具体代码,供大家参考,具体内容如下...
目录 1. C语言文件接口(库函数) 1.1 fopen 1.2 fclose 1.3 fread 1.4 fwrite 1.5...
由于固态驱动器(SSD)的速度比传统的硬盘驱动器(HDD)快得多,并且价格越来越便宜...
本文实例为大家分享了javascript实现倒计时提示框的具体代码,供大家参考,具体...
首先到这里下载其源码。里面东西挺多的,我们基本上可以把它放到两个文件夹就是...