当前位置: 首页 > news >正文

面试题——存储引擎

  1. 简介

  1. 定义

数据库引擎简单来说就是一个"数据库发动机"。当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是数据引擎去访问数据库文件。以关系型数据库为例,你发SQL语句给数据库引擎,数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。
  
正式来说,数据库引擎是用于理和保数据的核心服务。利用数据库引擎可以控制访问权快速理事,从而满足企业内大多数需要处理大量数据的应用程序的要求,这包括创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)

  1. 类别

  1. ISAM(索引访问方法)

ISAM实现的数据构是多叉平衡。但是不支持事务处(如果数据,数据文件无法恢复),不支持外,不支持索引。允没有任何索引和主的表存在

  1. MYISAM

支持索引,但不支持事务处理和外键。使用表级锁,来优化多个并发的读写操作。但是需要经常运行optimize 表名恢复更新操作浪费的空间(因为数据库在删除等更新操作后,会在库中留下碎片,影响访问性能,所以必须采用optimize语句进行碎片整理)

  3.HEAP

Heap将数据存储在内存中,没有磁盘的IO操作,插入、更新查询速度很快。但是保存的数据不稳定(重启或者计算机关机就会消失),所以这种存储引擎中的表的生命周期很短,一般只使用一次。

  4.InnoDB

InnoDB要比ISAMMyISAM引擎慢很多

InnoDBMySQL表提供了ACID事务支持、系统崩溃修复能力和多版本并发控制(MVCC)的行级锁,该引擎还提供了行级锁和外键约束,所以InnoDB是事务型数据库的首选引擎。

采用B+树实现,索引与数据存储在同一文件中。

  1. InnoDB VS MyISAM

  1. 存储结构

  • InnoDB: 共享表空间,所有的数据都存储在一个单独的表空间中,一个表可以跨多个文件存在。

  • MyISAM: 每个表存储在三个分离的文件中,每一个文件的名字均以表的名字开始,扩展名指出文件类型:.frm文件存储表定义;·MYD (MYData)文件存储表的数据;.MYI (MYIndex)文件存储表的索引。

  1. 存储空间

  • InnoDB存储引擎为在主内存建立其专用的缓冲池来缓存数据和索引,所以需要更多的内存和存储。

  • MyISAM可被压缩(压缩的表是只读的),存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。

  1. 索引和数据

  • InnoDB存储索引的是B+树,叶子节点的data域保存了完整的数据记录,以主键作为键,其他列的值作为data域。所以数据本身就是索引文件。InnoDB要求表必须有主键,否则会自动选择某一列作为主键;InnoDB的辅助索引data域存储的是主键的值,所以当以辅助索引查找时,会先根据辅助索引找到主键,再根据主键索引找到实际的数据。

  • MYISAM:存储索引的是B+树,其叶子节点以主键作为键,data域存储的相应行记录的地址,因此索引和数据文件是分开的。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。与InnoDB不同的是MYISAM辅助索引存储的data域存储的是对应行的地址而不是主键。

  • InnoDB: 支持行级锁。如果执行某个SQL语句时,不确定要扫描的范围那么就会锁定全表。

  • MYISAM:支持表级锁。

  1. 是否支持事务

  • InnoDB: 事务安全型,支持外键

  • MYISAM:非事务安全型,不支持事务,不支持外键。

  1. 是否支持全文索引

  • InnoDB: 支持全文索引。

  • MYISAM:不支持全文索引。

  1. 是否保存行数

  • InnoDB中不保存表的具体行数,也就是说,执行select count(*) fromtable时,InnoDB要扫描一遍整个表来计算有多少行。

  • MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。

  1. 应用场景

  • InnoDB: 用于事务处理应用程序,如果应用中需要执行大量的插入删除操作就要用InnoDB,提高并发操作的性能。

MYISAM:管理非事务表,提供高速存储和查询操作。如果要进行大量select操作时适用。

 

转载于:https://www.cnblogs.com/winterfells/p/9432217.html

相关文章:

  • HTML(XHTML)基础知识(二)——【body】
  • 《性能测试诊断分析与优化》推荐序(2)
  • Go实现发送解析GET与POST请求
  • 转新浪微博 Facebook新园区黑客之路
  • N天学习一个Linux命令之dmesg
  • 数据越权访问,谁之错?
  • Spring STS Call Hierarchy 查找不到被调用的信息
  • 方格取数 2
  • jira中级使用说明(节选)
  • 道具研究(一)
  • Python3.6全栈开发实例[002]
  • 有爱游戏地图
  • 安卓(android)程序如何改变程序名称
  • JS引擎的执行机制:探究EventLoop(含Macro Task和Micro Task)
  • 如何改变iOS程序名称
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-flux杂记
  • ubuntu 下nginx安装 并支持https协议
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 安装python包到指定虚拟环境
  • 当SetTimeout遇到了字符串
  • 如何设计一个比特币钱包服务
  • 软件开发学习的5大技巧,你知道吗?
  • 实习面试笔记
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 一道闭包题引发的思考
  • #if 1...#endif
  • (6)设计一个TimeMap
  • (HAL库版)freeRTOS移植STMF103
  • (JS基础)String 类型
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)visual stdio 书签功能介绍
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***原理与防范
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET应用架构设计:原则、模式与实践 目录预览
  • .sh
  • @31省区市高考时间表来了,祝考试成功
  • @JoinTable会自动删除关联表的数据
  • [20171101]rman to destination.txt
  • [c]扫雷
  • [HackMyVM]靶场Boxing
  • [hive] 窗口函数 ROW_NUMBER()
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [Linux] LVS+Keepalived高可用集群部署
  • [office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记