Mysql存储引擎面试题

1、MySQL中使用什么存储引擎?

存储引擎称为表类型,数据使用各种技术存储在文件中。

技术涉及:

Storage mechanism

Locking levels

Indexing

Capabilities and functions.

MyISAM: 拥有较高的插入,查询速度,但不支持事务 

InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定 

BDB: 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性 

Memory :所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失 

Merge :将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用 

Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差 

Federated: 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 

Cluster/NDB :高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用 

CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV存储引擎不支持索引。 

BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继 

另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。 

http://baike.baidu.com/item/%E5%AD%98%E5%82%A8%E5%BC%95%E6%93%8E

2、如何控制HEAP表的最大尺寸?

Heal表的大小可通过称为max_heap_table_size的MySQL配置变量来控制。

3、MyISAM Static和MyISAM Dynamic有什么区别?

在MyISAM Static上的所有字段有固定宽度。动态MyISAM表将具有像TEXT,BLOB等字段,以适应不同长度的数据类型。MyISAM Static在受损情况下更容易恢复。

4、federated表是什么?

federated表,允许访问位于其他服务器数据库上的表。

5、 简述在MySQL数据库中MyISAM和InnoDB的区别

区别于其他数据库的最重要的特点就是其插件式的表存储引擎。存储引擎是基于表的,而不是数据库。

InnoDB与MyISAM的区别:

InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。

特点:行锁设计、支持外键,支持事务,支持并发,锁粒度是支持mvcc得行级锁; 

MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。

特点:不支持事务,锁粒度是支持并发插入得表级锁,支持表所和全文索引。操作速度快,不能读写操作太频繁;

MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;适合小数据,小并发

innodb是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。

       MyISAM:成熟、稳定、易于管理,快速读取。一些功能不支持(事务等),表级锁。

       InnoDB:支持事务、外键等特性、数据行锁定。空间占用大,不支持全文索引等。

5点不同

1.InnoDB支持事物,而MyISAM不支持事物 2.InnoDB支持行级锁,而MyISAM支持表级锁 3.InnoDB支持MVCC, 而MyISAM不支持 4.InnoDB支持外键,而MyISAM不支持 5.InnoDB不支持全文索引,而MyISAM支持。

6.InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持

7.InnoDB表支持多种行格式, myisam 不支持

8.InnoDB是索引组织表, myisam 是堆表

(2)、innodb引擎的4大特性

1.插入缓冲(insert buffer) 2.二次写(double write) 3.自适应哈希索引(ahi) 4.预读(read ahead)

(3)、各种不同 mysql 版本的Innodb的改进

MySQL5.6 下 Innodb 引擎的主要改进: ( 1) online DDL ( 2) memcached NoSQL 接口 ( 3) transportable tablespace( alter table discard/import tablespace) ( 4) MySQL 正常关闭时,可以 dump 出 buffer pool 的( space, page_no),重启时 reload,加快预热速度 ( 5) 索引和表的统计信息持久化到 mysql.innodb_table_stats 和mysql.innodb_index_stats,可提供稳定的执行计划 ( 6) Compressed row format 支持压缩表

MySQL 5.7 innodb 引擎主要改进 ( 1) 修改 varchar 字段长度有时可以使用 online DDL ( 2) Buffer pool 支持在线改变大小 ( 3) Buffer pool 支持导出部分比例 ( 4) 支持新建 innodb tablespace,并可以在其中创建多张表 ( 5) 磁盘临时表采用 innodb 存储,并且存储在 innodb temp tablespace 里面,以前是 myisam 存储 ( 6) 透明表空间压缩功能

6、 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)

MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、

Archive、CSV、Blackhole、MaxDB 等等十几个引擎

7、Heap表是什么?

  • HEAP表存在于内存中,用于临时高速存储。
  • BLOB或TEXT字段是不允许的
  • 只能使用比较运算符=,<,>,=>,= <
  • HEAP表不支持AUTO_INCREMENT
  • 索引不可为NULL

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

如果创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是18;但是如果重启(文中提到的)MySQL的话,这条记录的ID是15。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。

        如果表的类型是MylSAM,那么这条记录的ID就是18。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

9、innodb和myisam,select  count(*)哪个更快,为什么

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

10、innodb的事务与日志的实现方式

(1)、有多少种日志

redo和undo

(2)、日志的存放形式

redo:在页修改的时候,先写到 redo log buffer 里面, 然后写到 redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件( fsync)。 Undo:在 MySQL5.5 之前, undo 只能存放在 ibdata*文件里面, 5.6 之后,可以通过设置 innodb_undo_tablespaces 参数把 undo log 存放在 ibdata*之外。

(3)、事务是如何通过日志来实现的,说得越深入越好

基本流程如下: 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的 状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。

猜你喜欢

转载自blog.csdn.net/qq_34988624/article/details/85838638