Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

MySQL存储引擎

阅读数:次 2018-06-07
字数统计: 2.3k字   |   阅读时长≈ 8分

基本概念

所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:

mark

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,只是存储引擎不同!

Mysql使用

连接Mysql服务

1
mysql -h 127.0.0.1 -P 3306 -u root -p

-h 选项默认是127.0.0.1 -P默认是3306 后面有没有空格都是可以的
很多时候我们要使用本地Mysql服务的话,直接简写为:

1
mysql -uroot -p

使用services.msc命令可以打开服务管理,来启动和关闭Mysql服务
《MySql服务器的启动和关闭》这篇文章就讲述了如何通过命令其启动和关闭Mysql

SQL分类

DDL数据定义语言,用来维护存储数据的结构
代表指令: create、 drop、alter

DML数据操纵语言,用来对数据进行行操作
代表指令: insert、delete、update

DML中又单独分了一个DQL,数据查询语言,代表指令: select

DCL数据控制语言,主要负责权限管理理和事务
代表指令: grant 、revoke 、commit

MySQL架构

MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、Mac 和 Solaris。各种系统在底层实现⽅方⾯面各有不不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性:

mark

说说这张图:

  • Client Connectors 是客户端链接,这个不用细说,就是应用程序与Mysql交互的接口,毕竟Mysql是要为程序提供数据存储服务的,所以必须将操作接口暴露出来,假如你是一个Java开发者,那么JDBC可以轻松链接上Mysql服务,就可以让你的Java程序使用上Mysql提供的服务
  • Connection Pool这个是连接池,Mysql与外界可能不止有一个连接,多次链接和断开会造成非常大的性能消耗,于是用使用连接池来管理这些链接,这就如Java的线程池来管理线程一样,通过连接池来避免性能损耗
  • Management Serveices & Utilities是管理服务和工具组件,例如备份恢复、Mysql复制、安全性验证、集群、分区工作台等,下面会演示一个Mysql备份的例子
  • SQL Interface 就是SQL接口,存储过程、触发器、视图等,接受用户的SQL命令,并且返回用户需要查询的结果。接收DML(data manipulation language)数据操纵语言、DDL(data definition language数据库定义语言、比如select from就是调用SQL Interface
  • Parser 是解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本,将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的,如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
  • Optimizer 是查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化,这个不难理解,假如你有一张info 表中的字段是年龄(很显然这个额字段值是大于0的),如果你在查询的时候的SQL语句是select * form info where age=-10,那么这条语句经过优化器之后不会再被执行,这就好像优化器知道不可能存在年龄小于0的条目
  • Caches 是高速缓存, 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。 通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
  • Pluggable Storage Engines 是存储引擎,图中的圆柱体都是存储引擎,Mysql默认的存储引擎是InnoDB,后面谈论存储引擎
  • FileSystem 就是文件系统,Mysql数据库的数据最终还是要存放到文件中,所以我们可以理解为数据库就是一种帮我们管理数据的软件,处于文件系统的应用程序之间专门提供数据管理的软件,把数据的增删改查以及他的功能做了完美的封装,使用起来安全性更高,更方便我们队数据进行操作

Mysql存储引擎

存储引擎是:数据库管理理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎,所以你可以看到在Mysql的架构图上存储引擎的小插头,存储引擎是插拔式的,默认是InnoDB(从MySQL5.5.8开始,之前是MyISAM),当然也可以选择其他的存储引擎
使用show engines;命令可以查看支持的存储引擎:

mark 接下来说说他们的区别:

接下来说说他们的区别:

mark

MyISAM存储引擎

MyISAM是MySQL官方提供默认的存储引擎,其特点是不支持事务、表锁和全文索引,对于一些OLAP系统(OLAP 系统强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等),操作速度快。关于《OLAP、OLTP的介绍和比较》

每个MyISAM在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.MYD (MYData,存储数据)、.MYI (MYIndex,存储索引)。这里特别要注意的是MyISAM不缓存数据文件,只缓存索引文件。

InnoDB存储引擎

InnoDB存储引擎支持事务,主要面向OLTP方面的应用,其特点是行锁设置、支持外键,并支持类似于Oracle的非锁定读,即默认情况下读不产生锁。InnoDB将数据放在一个逻辑表空间中。InnoDB通过多版本并发控制来获得高并发性,实现了ANSI标准的4种隔离级别,默认为Repeatable,使用一种被称为next-key locking的策略避免幻读。

对于表中数据的存储,InnoDB采用类似Oracle索引组织表Clustered的方式进行存储。

InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比Myisam的存储引擎,InnoDB 写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引

NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点是数据全部放在内存中,因此通过主键查找非常快。

关于NDB,有一个问题需要注意,它的连接(join)操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,查询速度会很慢。

Memory (Heap) 存储引擎

Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

Archive存储引擎

正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持INSERT和SELECT操作,其设计的主要目的是提供高速的插入和压缩功能。

Federated存储引擎

Federated存储引擎不存放数据,它至少指向一台远程MySQL数据库服务器上的表,非常类似于Oracle的透明网关。

InnoDB与MyISAM应用场景

参考:《InnoDB与MyISAM两者的区别》
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能

存储引擎相关SQL

查看Mysql已提供存储引擎

1
show engines;

查看Mysql默认存储引擎:

1
show variables like 'storage_engine';

查看某个表的存储引擎:

1
show create table 表名;

修改表的存储引擎:

1
alter table 表名 engine=引擎
赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/1336292242.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • MySQL
  • 数据库

扫一扫,分享到微信

MySQL库表操作
Linux调度器
  1. 1. 基本概念
  2. 2. Mysql使用
    1. 2.1. 连接Mysql服务
  3. 3. SQL分类
  4. 4. MySQL架构
  5. 5. Mysql存储引擎
    1. 5.1. MyISAM存储引擎
    2. 5.2. InnoDB存储引擎
    3. 5.3. NDB存储引擎
    4. 5.4. Memory (Heap) 存储引擎
    5. 5.5. Archive存储引擎
  6. 6. Federated存储引擎
    1. 6.1. InnoDB与MyISAM应用场景
  7. 7. 存储引擎相关SQL
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书