首页 > 数据库 >Mysql原理学习

Mysql原理学习

时间:2022-09-26 14:01:08浏览次数:76  
标签:存储 聚簇 节点 学习 索引 InnoDB Mysql 原理 主键

存储引擎

数据库引擎是数据库用于存储、处理和保护数据的核心服务,不同的数据库引擎有其各自的特点,如存储机制、索引技巧、主键的处理、锁的粒度等特点便随着引擎的不同而变化。不同的数据文件在磁盘的组织形式。

image

常用存储引擎

InnoDB

InnoDB 支持ACID,行锁和外键,并且是Mysql的默认存储引擎。
InnoDB 主要通过锁和MVCC来支持高并发。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。
InnoDB 表是基于聚簇索引建立的,不过它的二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键很大的话,其他的所有索引都会很大。因此,若表上的索引较多的话,主键应当尽可能的小。

逻辑存储结构

InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存放方式的表称为索引组织表。如果没有主键则通过以下方式:

  • 判断表中是否有非空的唯一键,有,则以该列为主键。若有多个非空唯一键,则以第一个定义的为主键
  • InnoDB引擎自动创建一个6字节大小的rowid作为主键。rowid的分配是全局的,所有的表都共享这个ID,并不是每个行记录都有rowid。

InnoDB 采用B+树存储数据,为什么选择B+树作为数据库的存储结构?

  • AVL树、红黑树:每个节点上仅仅存储了单一节点,会导致整个树的深度较大,IO也因此增多
  • Hash:
    • 难以设计散列度高的哈希函数
    • 虽然等值查询较快,但对于范围查询则难以查询
  • B树:虽然每个节点能够存储多个值,但由于节点中直接存储了记录,因此单个节点所能够记录的数据有限。
  • B+树,叶子节点存储真实数据,而非叶子节点仅仅存储索引值,因此每个节点通常能够记录更多的索引,降低了树的高度。

聚簇索引的优缺点:

  • 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。
  • 聚簇索引对于主键的排序查找和范围查找速度非常快。
  • 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
  • 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
  • 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据

InnoDB的逻辑存储结构包含:

  • 表空间
  • 页: 页是InnoDB磁盘管理的最小单位,默认每个页的大小为16KB

image

MyIsam

MyIsam 使用非聚簇索引

  • 不支持事务
  • 不支持外键
  • 表级锁定,读写互相阻塞:读阻塞写,不会阻塞读。而写锁则会把读写都阻塞。
  • 只缓存索引,不缓存数据:缓存在内存的是索引,不是数据。MyIsam的索引是压缩的,可以更好的利用内存,而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。
  • 读取速度较快
Memory

Memory 采用的逻辑存储介质是系统内存,支持哈希和B树索引。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。

InnoDB MyIsam Memory
事务 × ×
全文索引 ×
树索引
哈希索引 × ×
数据缓存 × N/A
外键 × ×

索引

MVCC

事务

日志系统

参考链接

标签:存储,聚簇,节点,学习,索引,InnoDB,Mysql,原理,主键
From: https://www.cnblogs.com/houlixie/p/16730456.html

相关文章

  • STS用Maven写一个登录页面 - 用MySQL验证登录用户
    上一章我们已经将MySQL和STS的连接进行了测试,下面我们就用MySQL验证登录用户是否正确。可参考:https://www.cnblogs.com/smart-zihan/p/15041013.html第一步:建立数据库接......
  • js红宝书学习笔记(一)引用类型
    一.引用类型  ECMAScript中,引用类型是一种数据结构称之为对象定义,,引用对象不同于传统面向对象语言所支持的类和接口等基本结构 创建Object实例的两种方式:new操......
  • MySQL索引相关的问题
    关系型数据库相关的大部分问题,都要往如何减少IO次数以及如何减少随机IO次数上想,这也是关系数据库设计时考虑的一个目标。为什么索引使用B+树实际上不管你使用什么结构,B......
  • 本书的关键学习:实用程序员
    本书的关键学习:实用程序员最近,我看到了AndyHunt和DaveThomas的一本非常受欢迎的书,名为ThePragmaticProgrammer。显然,如果你在谷歌上搜索“最佳编程书籍”,这本书......
  • 多线程——Robyn编程学习(Java)
    多线程的作用能够创建多个线程,此外线程可以体现程序的动态性,提高效率,在抢票以及各种游戏之中具有非常重要的作用。(线程的魅力在坦克大战中体现的淋漓尽致)多线程的知识体......
  • PADS应用笔记:Logic画原理图时设置图业大小
    问题画原理图时默认的图业太小,想换大点怎么办方法在工具->选项界面进入设置界面,在这个界面下进行设置......
  • JS promise 原理
    Promise对象有三种状态:pending、fullfilled 和 rejected,分别代表了promise对象处于等待、执行成功和执行失败状态。创建promise对象后处于pending状态,pending状态......
  • 【记录】学习 阿里巴巴Java开发手册 (持续更新)
    前言在这里记录一下自己学习编码的规范和规约的过程,希望可以纠正自己的不良习惯,让编码更加规范和合理,具有更加好的可读性。阿里巴巴Java开发手册v1.3.0分为六个部分。针......
  • 软件工程师:意外之旅(如何学习编码和找到工作)
    软件工程师:意外之旅(如何学习编码和找到工作)如果(in_a_rush):如果你上车迟到了,需要完成你最近的副业,或者(上帝保佑)和一个真正的人(不是人工智能)约会,我会为你节省一些时间。TL;......
  • delphi cxSplitter学习笔记
     //cxSplitter禁用移动和拖拽,只允许点击箭头按钮触发缩放(展开和收起)procedureTFraModleBase.cxSplitter3CanResize(Sender:TObject;varNewSize:Integer;varAcc......