【数据库】震惊!!MySQL的底层原理竟然是这样

老生常谈的数据库引擎到底是Who?

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

当我们理解了引擎这个概念,就会知道提供各种不同引擎给你选择,然后用你选出来的引擎去处理sql语句

MYSQL常用的四个数据库引擎:
(1) ISAM:ISAM是一个定义明确的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。
特性:
1.读取操作的速度很快
2.不占用大量的内存和存储资源
缺点:
不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。

(2) MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。
特性:
1.不支持事物,MyISAM存储引擎不支持事物,所以对事物有要求的业务场景不能使用
2.表级锁定,其锁定机制是表级索引,这虽然可以让锁定的现实成本很小但也是同时大大降低了其并发性能
3.读写互相阻塞,不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读
4.只会缓存因素,MyISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但这个缓存区只会缓存索引,而不会缓存数据
5.不能在表损坏后恢复数据。

适用场景
1.不需要事物支持(不支持事物)
2.并发相对较低(锁定机制问题)
3.数据修改相对较少(阻塞问题)
4.以读为主(快速读取操作效率高)
5.数据一致性要求不是非常高

(3) InnoDB:在使用MYSQL的时候,我们所要面对的问题都是ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。
特性:
1.具有较好的事物支持,支持4个事物隔离级别,支持多版本读
2.行级锁定,通过索引实现,全表扫描任然会是表锁,注意间隙锁的影响
3.读写阻塞与事物隔离级别有关
4.具有非常高效的缓存特性,能缓存索引,也能缓存数据
5.整个表和主键以Cluster方式存储,组成一颗平衡树
6.所有Secondary Index都会保存主键信息

适用场景
1.需要事物支持(具有较好的事物特性)
2.行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
3.数据更新较为频繁的场景
4.数据一致性要求较高
5.硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽量减少磁盘IO

(4) MEMORY: MEMORY是MySQL中一类特殊的存储引擎。**它使用存储在内存中的内容来创建表,而且数据全部放在内存中。**这些特性与前面的两个很不同。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。MEMORY默认使用哈希索引。速度比使用B型树索引快。 Note: MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。

总结一下,在实际工作中,选择一个合适的存储引擎是一个比较复杂的问题,每个引擎都有自己的优缺点,往往是根据实际的业务场景来选择合适的引擎:
在这里插入图片描述

(1) InnoDB:支持事务处理(高并发),支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback)。
(2) MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比较低,也可以使用。
(3) MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

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

那么问题来了,要对引擎做一些操作,要怎么做呢:
可以修改配置文件中的default-storage-engine。
可以通过:show variables like ‘default_storage_engine’;查看当前数据库到默认引擎
命令:show engines和show variables like 'have%'可以列出当前数据库所支持到引擎。其中Value显示为disabled的记录表示数据库支持此引擎,而在数据库启动时被禁用。
可以使用下面语句来查询哪些存储引擎支持事物处理:select engine from information_chema.engines where transactions =‘yes’;

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

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

以上是本农在近期的学习中的总结,希望各位看官给出宝贵意见~~

猜你喜欢

转载自blog.csdn.net/weixin_42777004/article/details/107658234