MySQL 常用的存储引擎有哪些?
OLTP 和 OLAP
OLAP(On-Line Analytical Processing)联机分析处理。OLAP系统强调的是数据分析,响应速度要求没那么高。
OLTP(On-Line Transaction Processing)联机事务处理。OLTP系统强调的是内存效率,实时性比较高。
mysql 采用插件式存储引擎的设计结构。主要包括以下存储引擎:
InnoDB
支持事务,其设计目标主要面向联机事务处理(OLTP)的应用,其特点是行锁设计、支持外键,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL 标准的四中隔离。默认RR 可重复读。除此之外还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。
InnoDB 存储数据采用聚集的方式,每张表按主键的顺序进行存储,又叫索引组织表。
MyISAM
不支持事务、表锁设计、支持全文索引,主要面向 OLAP 数据库应用。
NDB 存储引擎
可以提供更高级别的高可用性,其特点是数据全部放在内存中,因此主键查找的速度极快。NDB 存储引擎是高可用、高性能、高可扩展性的数据库集群系统,其面向的也是OLTP 的数据库应用系统。
了解 InnoDB的架构体系吗?简单介绍下?
InnoDB 由多个内存块,这些内存块组成一个大的内存池,负责如下工作:
- 维护所有进程/线程需要访问的多个内部数据结构.
- 缓存磁盘上的数据,方便快速的读取,并且在对磁盘文件的数据进行修改之前在这里缓存.
- 重做日志(redo log)缓冲。
后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外,将已经修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常情况下 InnoDB 能恢复到正常运行状态。
-
InnoDB 的关键特性有哪些?
- 插入缓冲 插入缓冲带来 InnoDB 存储引擎的性能提升。
对于非聚集索引的插入或更新操作,不是每次直接插入索引页中。而是先判断插入的非聚集索引页是否在缓冲池中。如果在,则直接插入;如果不在,则先放入一个插入缓冲区中,让数据库以为数据已经插入到叶子节点上了,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对非聚集索引执行插入和修改操作的性能。 插入缓冲需要满足两个条件: ** 索引是辅助索引 ** 索引不是唯一的
- 两次写 两次写带来 InnoDB 存储引擎数据的可靠性。
在应用重做日志之前,需要一个页的副本,当写入失效发生时,先通过页的副本还原页,再进行重做,这就是 doublewrite。
doubelwrite 由两部分组成:一部分是内存中的 doublewrite buffer,大小为 2MB;另一部分是物理磁盘上共享表空间中连续的 128个页,即两个区(extent),大小同样为 2MB。
当缓冲池的脏页刷新时,并不直接写磁盘,而是会通过 memcpy 函数将脏页先拷贝到内存中的 doublewrite buffer,之后通过 doublewrite buffer 再分两次,每次写入 1MB 到共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免缓冲写带来的问题。这个过程中,因为 doubelwrite 页是连续的,因此这个过程是顺序写的,开销并不是很大。在完成 doubelwrite 页的写入后,再将 doublewrite buffer 中的页写入各个表空间文件中,此时的写是离散的。
-
自适应哈希索引 InnoDB 存储引擎会监控对表上的索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度特别快。而且不需要将整个表都建立哈希索引,InnoDB 存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。
-
异步 IO
-
刷新邻接页
-
MySQL 日志文件有哪些?
-
InnoDB 存储引擎的日志文件有哪些?
什么是索引组织表?
B+ 树索引
B+树索引本质就是 B+树在数据库中的实现,但是 B+树索引在数据库中有一个特点就是其高扇出性,因此在数据库中,B+树的高度一般都在 2~3 层。
数据库中的 B+树索引可以分为聚集索引和辅助聚集索引。
但是不管是聚集索引还是非聚集索引,其内部都是 B+树的,即高度平衡的,叶子节点存放着所有的数据。聚集索引和非聚集索引不同的是:叶子节点存放的是否是一整行的信息。
聚集索引
辅助索引
-
介绍下 InnoDB 数据页的结构?
-
B+ 树作为索引有哪些优势?
-
B+ 树索引的分裂了解吗?(增删数据如何实现索引的更新)
-
什么是联合索引?是怎么组织的?
-
覆盖索引是什么?
-
MRR 了解吗?简单介绍下?
-
ICP 了解吗?介绍下?
-
锁
-
事务
-
冷备和热备
-
可能导致数据库的瓶颈有哪些?
- IO
- CPU 不管是 IO 瓶颈还是 CPU 瓶颈,最终都会导致数据库的连接活跃数增加,进而逼近甚至达到数据库可承载的活跃连接数的阈值。在业务服务看来,就是可用数据库连接少甚至无连接可用。
-
IO 瓶颈?
- 第一种:磁盘读 IO 瓶颈,热点数据太多,数据库缓存放不下,每次查询会产生大量的 IO,降低查询速度 -> 分库和垂直分表;
- 第二种:网络 IO 瓶颈,请求的数据太多,网络带宽不够 -> 分库
-
CPU 瓶颈?
- 第一种:SQL 问题,如 SQL 中包含 join、group by、order by,非索引字段查询等,增加 CPU 运算的操作 -> SQL 优化,简历合适的索引,在业务服务层进行运算;
- 第二种:表单数据量太大,查询时扫描的行太多,SQL 效率低,增加 CPU 运算的操作 -> 水平分表;
-
分库分表的优势及导致的问题?