• MySQL-存储引擎基础


    1.存储引擎认识及相关知识

    1.1存储引擎概念:

    官方定义:将数据以不同的技术存储在文件(内存)中,该技术即为存储引擎,也称为表类型。每种存储引擎使用不同的存储机制、索引技巧及锁定水平。简单讲,存储引擎是存储数据,查询数据的技术。

    1.2相关知识

    .并发:之前的认识一直比较片面:并发即是同时有很多对象进行相同/类似操作,此时观察系统的反应:响应时间,资源分配,还有一层含义:
    多个对象对同一数据进行修改操作。
    .并发控制:多个连接(对象)对数据进行修改操作,保证数据的一致性和完整性的技术。用的技术是锁:分共享锁(读锁),排他锁(写锁)。
    .共享锁和排他锁:共享锁,允许同一时间可以多个连接读取资源;
    排他锁,在对某一数据进行写 操作时,会禁止其他连接进行操作,有排他性。锁也会消耗资源,所以,用排他锁时,要锁最小的,不是最大的,比如:对某条记录进行修改,只锁定该条记录,而不是锁整张表。
    .锁策略:表级锁:一张表就一个锁,所以是最小开销锁;
    行级锁:表中记录很多,一行一个锁,会有很多,所以,是最大开销锁。
    .事务:目的是保证数据的完整性。
    特性: 1.原子性(Atomicity):处于同一事务中的多条语句不可分割;
    2.一致性(Consistency):必须使DB从一个一致性状态变换到另外一个一致性状态;
    3.隔离型(Isolation):多线程环境下,一个线程中的事务不能被其他线程中事务打扰;
    4.持久性(Durability):事务一旦提交,应该被永久保存。
    .脏读、幻读、虚读:
    脏读:一个线程中事务读取到另外一个线程中未提交的数据,简单说一个事务修改了记录数据,但还未提交,但此时另一个事务读取了该记录,导致读到脏数据。
    幻读:当一个线程修改整张表中所有数据时,此时另一个线程往表中插入了数据,导致第一个线程用户发现处理表中数据还有未修改数据,即是幻读。简单讲,一个事务的更新操作被另一个事务更新操作覆盖,导致数据不一致。
    虚读:又称不可重复读,指在一个事务内多次读取同一数据集合,发生了事务读取不一致情况。由于查询时系统中其他事务修改的提交而引起的。比如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行校验而再次读取该数据,便得到了不同结果。
    虚读和幻读区别:从结果上看,两者都表现为 两次读取的结果不一致,但从控制角度:虚读,只需要锁住满足条件的记录;幻读,只要锁住满足条件及其相近的记录。
    总结:不可重复读侧重于修改;
    幻读侧重于新增和删除;
    解决不可重复读问题只需要锁住满足条件的行,解决幻读需要锁表。
    索引:对数据表中一列或多列的值进行排序的一种结构。可以快速访问数据表中特定信息。通常比喻成书中目录。
    外键:保证数据一致性的策略。

    2.存储引擎分类

    MyISAM
    InnnoDB
    Memory
    CSV
    Archive

    3.存储引擎特点:

    特点

    4.存储引擎锁的介绍

    4.1InnoDB的锁

    默认采用行锁,自动加锁,无需人工干预:对UDI(UPDATE,DELETE,INSERT)会自动给涉及数据及加排他锁,对普通SELECT,不加任何锁。
    在未使用索引字段查询时升级为表锁,但行锁加锁慢,开销大,容易出现死锁,其优点是锁力度小,发生锁冲突的概率低,处理并发能力强。
    语法:
    共享锁:select * from tableName where ... +lock in share more
    排他锁:select * from tableName where ...+for update

    4.2MyISAM锁

    MyISAM不容易出现死锁,因为不支持事务,相当于每一条SQL就是一个事务,可以一次获得SQL语句所需要的全部锁,当某个会话执行完一条语句之后会立马把锁给释放,并不会把锁保留。
    只支持表锁,可以通过table_locks_waited和table_locks_immediate状态变量分析系统上的表锁争用情况:
    表锁争用情况
    table_locks_waited值比较高,说明存在比较严重的表级锁争用情况。
    表级锁模式:表共享读锁(Table Read Lock),表独占写锁(Table Write Lock)。锁模式兼容性如下:
    锁模式兼容性
    从上图可知,MyISAM的表读操作 ,不会注释其他用户对同一表的读请求,但会阻塞对同一表的写请求;MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作。
    其中,读操作与写操作之间,及写操作之间都是串行的:当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作,其他线程的读、写操作都会等待,直到锁被释放,所以表级锁的并发处理性能比较差。
    加表锁语法:
    说明:以下命令是显示加锁,lock table命令不能访问未加锁的表。
    lock table tableName read;
    lock table tableName write;
    释放锁语法:
    unlock tables;

    4.3InnoDB和MyISAM的区别:

    1.InnoDB支持事务(transaction);
    2.默认采用行级锁,而MyISAM只支持表锁。

  • 相关阅读:
    解决 'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
    关于IDEA的Maven打jar包springboot项目问题,打成可执行jar包,IDEA创建的maven项目和spring initializr项目
    Flink接收RabbitMQ数据写入到Oracle
    操作MongoDB好用的图形化工具,Robomongo -> 下载 -> 安装
    PL/SQL Developer -> 下载 -> 安装 ->执行SQL -> 设置本地/远程连接
    MongoDB学习笔记,基础+增删改查+索引+聚合...
    SpringBoot整合MongoDB JPA,测试MongoRepository与MongoTemplate用法,简单增删改查+高级聚合
    Elasticsearch没看文档之前,整理的一些知识
    Elasticsearch中文文档,内容不全
    Elasticsearch 7.4.0官方文档操作
  • 原文地址:https://www.cnblogs.com/dLarger/p/12929575.html
Copyright © 2020-2023  润新知