MYSQL 存储引擎概述
一、存储引擎
Mysql中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中每一种技术都使用了不同的存储机制,索引技巧、锁定水平并且最终提供广泛的不同功能和能力。通过选择不同的技术,你能够获得额外的速度或功能,从而改善你的应用的整体功能。
二、分类
1.MYISAM存储引擎:
不支持事务,也不支持外键,优势是访问速度快,对事务完整性没有要求或者以SELECT,INSERT为主的应用基本可以用这个引擎创建表。
(1)数据存储形式
MyISAM采用的是索引与数据分离的形式,将数据保存在三个文件中.frm.MYD,.MYIs。
.frm存储表结构
.MYD存储表的数据
.MYI存储表索引
(2)锁的粒度
MYISAM只支持表锁不支持行锁,所以读取时对表加上共享锁,在写入是对表加上排他锁。由于是对整张表加锁,相比INNODB,在并发写入时效率很低。
(3)数据的存储的特点
MYISAM是基于非聚簇索引进行存储的。
(4)表的存储格式
表的存储格式分成三种表 静态表,动态表,压缩表。
静态表:表中的字段都是非变长字段。这样每个记录都是固定长度的,优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多(因为存储时会按照死的宽大度定义补足空格)ps:在取数据的时候,默认会把字段后面的空格去掉,如果不注意会把数据本身带的空格也会忽略。
动态表:
记录不是固定长度的,这样存储的优点是占用的空间相对较少;缺点:频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE或者myisamchk-r命令来改善性能。
压缩表:因为每个记录是被单独压缩的,所以只有非常小的访问开支
(5)其他
MyISAM提供了大量的特性,包括全文索引,压缩,空间函数,延迟更新索引键等。
进行压缩后的表是不能进行修改的,但是压缩表可以极大减少磁盘占用空间,因此也可以减少磁盘IO,从而提供查询性能。
全文索引,是一种基于分词创建的索引,可以支持复杂的查询。
延迟更新索引键,不会将更新的索引数据立即写入到磁盘,而是会写到内存中的缓冲区中,只有在清除缓冲区时候才会将对应的索引写入磁盘,这种方式大大提升了写入性能。
2.INNODB存储引擎
INNODB存储是MYSQL默认事务引擎,也是目前重要、使用最广泛的存储引擎。
概述:
支持事务,行锁设计,支持MVCC(多版本并发控制)来支持高并发,支持外键,提供一致性非锁定读设计。
优点:
DML操作遵循ACID模型(原子性、一致性、隔离性和持久性),支持事务,支持CRASH-RECOVERY特性(当MYSQL发生故障重启后,对于INNODB表,没有完成的事务将通过REDO日志重新进行,已经提交但是没有写到数据文件中的数据,将从doublewrite buffer中重新构建)以保护数据。
2、InnoDB buffer pool 缓存被访问的表和索引信息,经常使用的数据直接从内存中读取。
3、inserts,update,deletes操作被一种称为change buffering的机制所优化。InnoDB不仅允许多并发读写同一张表,它还会缓存发生改变的数据,优化磁盘I/O。
4、当数据库运行大表的长时间查询且反复访问相同表的相同行时,一种叫做Adaptive Hash Index的特性使这些查询更快,就像数据从哈希表中查询出来一样。
5、可以压缩表和相关的索引。
6、可以对性能和可用性造成很小影响地创建和删除索引。
7、可以很快TRUNCATE掉一个file_per_table表空间,释放出磁盘空间供操作系统使用,而不必释放出仅能供InnoDB所重用的系统表空间。
8、支持行级锁和一致性读,提高多用户的并发性和性能。
9、支持主键,提高查询性能。
10、为了保持数据的完整性,InnoDB也支持外键。
11、你可以将InnoDB表与MySQL其他存储引擎的表自由组合在一起使用。例如,在一个SQL中,你可以关联一张InnoDB表和一个内存表。
12、在处理大量数据的时候,InnoDB引擎可以有效的发挥CPU效率和提升性能。.
INNODB体系结构
- 后台线程(多线程模型)
- Master Thread
负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓存、UNDO页的回收。 - IO Thread
使用AIO处理写请求,IO Thread负责IO请求的回调处理 - Purge Thread
事务提交后,回收已经使用并且分配的undo页。
- Master Thread
- 内存
- 缓冲池
InnoDB是基于磁盘存储的,并将其中的记录按照页的方式进行管理,使用缓冲池技术来提高数据库的整体性能。(读取页的时候,将页放到缓冲池中(FIX操作),下次读缓冲池中的即可;修改页时,先修改缓冲池中的页,再以一定的频率刷新到磁盘(CheckPoint机制))- 缓冲池管理
数据库中的缓冲池通过LRU算法进行管理(LRU List),使用最频繁的页在LRU List的前端,当缓冲池中不能存放新读取到的页时,首先释放LRU列表尾端的页。
- 缓冲池管理
- 重做日志缓冲
InnoDB将重做日志信息放入该缓冲区,然后按照一定的频率将其刷新到重做日志文件。 - CheckPoint机制
- 缩短数据库恢复时间:
数据库宕机时,数据库不需要重做所有的日志因为CheckPoint之前的页都已经刷新回磁盘。 - 缓冲池不够用时,将脏页刷新到磁盘(Fuzzy CheckPoint 部分刷新)
当缓冲池不够用时,根据LRU算法,释放list尾端的页,若该页为脏页,则强制执行CheckPoint,刷新回磁盘。 - 重做日志不可用时,刷新脏页
因为重做日志不是无限增大的,当到达一定数量时,由第一条所述,数据库恢复不需要这部分重做日志,这部分就可以被覆盖重用,若此时重做日志还有用,那么强制产生CheckPoint,将缓冲池中的页至少刷新到当前重做日志的位置。
总结一下:缓冲池不够用时,将最少使用的脏页刷新回磁盘,释放该页;当重做日志不够用时,将缓冲池刷新到当前重做日志的位置,放弃一部分重做日志,用于新的重做日志;数据库关闭时,发生Sharp CheckPoint,全部刷新
- 缩短数据库恢复时间:
- 缓冲池
- InnoDB 关键特性
- 插入缓冲
- 两次写
- 自适应哈希索引
- 异步IO
- 刷新邻接页
三、其他存储引擎
MYSQL还有其他存储引擎,包括MEMORY存储引擎,MERGE存储引擎,ARCHIVE,BDB,Federated,TOKUDB
MYSQL 存储引擎概述的更多相关文章
- mysql基础之-mysql存储引擎概述(八)
0x01 mysql 存储引擎:存储引擎也通常被称作“表类型” mysql> show engines; --- 查看当前所有所支持的存储引擎 mysql> show table st ...
- MySQL存储引擎概述
一.MySQL支持插件式存储引擎,默认包括有多种存储引擎,还可以自己定制化引擎,引擎是在表级别设置的. 二.各种存储引擎的特性 (A) MyISAM :不支持事务.不支持外键.访问速度快. 每个MyI ...
- 第 3 章 MySQL 存储引擎简介
第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...
- 7.Mysql存储引擎
7.表类型(存储引擎)的选择7.1 Mysql存储引擎概述 mysql支持插件式存储引擎,即存储引擎以插件形式存在于mysql库中. mysql支持的存储引擎包括:MyISAM.InnoDB.BDB. ...
- MySQL性能调优与架构设计——第3章 MySQL存储引擎简介
第3章 MySQL存储引擎简介 3.1 MySQL 存储引擎概述 MyISAM存储引擎是MySQL默认的存储引擎,也是目前MySQL使用最为广泛的存储引擎之一.他的前身就是我们在MySQL发展历程中所 ...
- Mysql存储引擎的选择
Mysql存储引擎概述 mysql的存储引擎是插件式的,用户可以根据需求选择如何存储和索引数据是否使用事务等. Mysql支持多种存储引擎,用户可以选择不同的引擎来提高应用的效率,灵活的存储方案,存储 ...
- MySQL体系结构和存储引擎概述
MySQL体系结构和存储引擎概述 一.定义数据库和实例 数据库: 物理操作系统文件或其他形式文件类型的集合.数据库文件可以是frm.MYD.ibd 结尾的文件. 从概念上来说,数据库是文件的集合,是 ...
- Mysql存储引擎概念特点介绍及不同业务场景选用依据
目录 MySQL引擎概述 1 MySAM引擎介绍 2 什么是InnoDB引擎? 3 生产环境中如何批量更改MySQL引擎 4 有关MySQL引擎常见企业面试题 MySQL引擎概述 Mysql表存储结构 ...
- mysql存储引擎的种类与差别(innodb与myisam)
查找数据库的存数引擎: show engines show variables like '%storage_engine%' 更改数据库的引擎更改配置文件/etc/my.cnf 改动default- ...
随机推荐
- Android ADB常用命令使用
Android SDK: adb shell 命令的使用(am.pm.wm.screencap.monkey等) https://blog.csdn.net/xietansheng/article/d ...
- (5)Flask项目会员登录页
一.添加登录和登出的路由 修改app/home/views.py内容,增加登录("/login/")和登出("/logout/")的路由: # coding:u ...
- C语言 宽字符串
/* 宽字符串的打印 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- vue的mixin简化开发
vue的mixin可以将多个组件公用的声明周期方法和数据封装成一个对象,在不同的组件中自由插拔.实际做项目的时候,可以定义一些mixin,供多个组件使用.也非常有必要定义一个全局的mixin对象,对所 ...
- 【Git】The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established.
背景,在服务器用www用户身份 执行拉取命令报错 sudo -u www git pull 原因分析: 在新生成密钥之后,在.ssh文件夹中少了known_hosts文件 解决办法: Are you ...
- [LeetCode] 270. Closest Binary Search Tree Value 最近的二叉搜索树的值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- 警方破获超大DDoS黑产案,20万个僵尸网络运营商被抓
中国警方已镇压并逮捕了一个犯罪集团,该集团经营着一个由200,000多个受感染网站构成的僵尸网络,这些网站被用来发起DDoS攻击. 这是中国当局针对兴旺的本地DDoS租用场景进行的首次重大镇压,最大的 ...
- 【神经网络与深度学习】【计算机视觉】Faster R-CNN
Faster R-CNN Fast-RCNN基本实现端对端(除了proposal阶段外),下一步自然就是要把proposal阶段也用CNN实现(放到GPU上).这就出现了Faster-RCNN,一个完 ...
- PHP设计模式 - 桥接模式
将抽象部分与它的实现部分分离,使他们都可以独立的变抽象与它的实现分离,即抽象类和它的派生类用来实现自己的对象 桥接与适配器模式的关系(适配器模式上面已讲解): 桥接属于聚合关系,两者关联 但不继承 适 ...
- Jenkins运行python脚本出现 configparser.NoSectionError: No section: 'XXXXXX'
原来的代码如下: def get_test_config(tag, key, config="config.ini"): cf = configparser.ConfigParse ...