mysql

MySQL --- 存储引擎

2021-04-15  本文已影响0人  _code_x

存储引擎是MySQL的组件,用于处理不同表类型的SQL操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

使用哪一种引擎可以灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能 。

MySQL服务器使用可插拔的存储引擎体系结构,可以从运行中的 MySQL 服务器加载或卸载存储引擎。

1.存储引擎相关的命令:

>mysql> show engines;  # 查看 MySQL 提供的所有存储引擎

mysql> show variables like '%storage_engine%';  # 默认存储引擎

show table status like "table_name" ;  # 查看表的使用的存储引擎
show table status from database where name="tablename"

2.存储引擎对比

常见的存储引擎就 InnoDB、MyISAM、Memory、NDB。

InnoDB 现在是 MySQL 默认的存储引擎,支持事务、行级锁定和外键

面试题: MyISAM 和 InnoDB 的区别?如何选择

如何选择存储引擎呢?

Innodb三大关键特性

插入缓冲、二次写入和自适应哈希。

1.插入缓冲

为什么要有这个特性,或者说这个特性解决了什么问题?

具体操作:

2.两次写

先了解:部分写失效

为什么要有这个特性,或者说这个特性解决了什么问题?

具体操作:

image
  1. 先将数据写入缓冲区
  2. 分两次将缓冲区的数据写入磁盘共享表空间,每次写入1MB
  3. 将缓冲区的数据写入数据文件
    ------假如宕机-------
  4. 将共享表空间的的页覆盖原有数据页
  5. 再应用重做日志(redo log)

两次写性能开销只在第二步
由于磁盘共享表空间是连续的,因此开销不是很大
可通过skip_innodb_doublewrite属性禁用,默认开启

3.自适应哈希

为什么MyISAM查询比Innodb快?

INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多:

数据库保证并发性(MVCC)

MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。

MVCC带来的好处?

多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。所以MVCC可以为数据库解决以下问题:

总之,MVCC就是为了解决数据库仅仅采用悲观锁这样性能不佳的形式去解决读-写冲突问题,所以在数据库中我们可以形成两个组合

这种组合的方式就可以最大程度的提高数据库并发性能,并解决读写冲突,和写写冲突导致的问题

一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?

哪个存储引擎执行 select count(*) 更快,为什么?

MyISAM更快,因为MyISAM内部维护了一个计数器,可以直接调取。

InnoDB 中 count(*) 语句是在执行的时候,全表扫描统计总数量,所以当数据越来越大时,语句就越来越耗时了,为什么 InnoDB 引擎不像 MyISAM 引擎一样,将总行数存储到磁盘上?这跟 InnoDB 的事务特性有关,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。

MySQL中InnoDB引擎的行锁是怎么实现的?

InnoDB是基于索引来完成行锁

例: select * from tab_with_index where id = 1 for update。

for update 可以根据条件来完成行锁锁定,并且 id是有索引键的列,如果id不是索引键,那么InnoDB将完成表锁,并发将无从谈起。

以上仅供学习使用

巨人的肩膀:

https://zhuanlan.zhihu.com/p/29150809
https://juejin.im/post/5e3eb616f265da570d734dcb#heading-105
https://blog.csdn.net/yin767833376/article/details/81511377
https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/database/MySQL
https://www.jianshu.com/p/8f877191eedc

上一篇 下一篇

猜你喜欢

热点阅读