mysql优化(一)- Mysql存储引擎

参考文章:

https://mp.weixin.qq.com/s?__biz=MzI4Mzc5NDk4MA==&mid=2247486569&idx=2&sn=97110c3d1b682c8dbb5f4e265ba715a3&chksm=eb840722dcf38e343fe8d48ad491a39d0d8015425c743fcf2febf98d577f47b4a7f23559d5a3&scene=0&xtrack=1#rd
==========================================
https://www.cnblogs.com/aikutao/p/11207365.html
https://baijiahao.baidu.com/s?id=1629308672995568286&wfr=spider&for=pc
锁:https://www.cnblogs.com/zyy1688/p/9924048.html

数据库引擎

  1. 简介:数据库引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据库引擎进行创建、查询、更新和删除数据,不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

存储引擎简单区别

在这里插入图片描述

在这里插入图片描述

  1. InnoDB、MylSAM两者引擎所用的索引的数据结构都是B+树,不过区别在于:
  1. InnorDb中的B+树的数据结构存储的内容是实际数据的地址值,它的索引和实际数据是分开的,只不过使用索引指向实际数据,这种索引的模式被成为非聚集索引。
    2.MyISAM中B+树的数据结构存储的都是实际的数据,这种索引称为聚集索引。

索引类别:

  1. 唯一索引:唯一索引不允许具有相同的索引值
  2. 主键索引:是唯一索引的特殊类型,为表定义一个主键,将自动创建主键索引。主键索引要求主键中每个值是唯一的,并且不能为空。
  3. 聚集索引(clustered)表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个。
  4. 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序,数据存储在一个位置,索引存储在另一个位置,索引中包含数据存储位置的一个指针,可以有多个,小于249个。

一、InnoDB

  1. 简介:这是MySQL 5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。它支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。

由于 InnoDB 利用的数据库主键作为索引 Key,所以 InnoDB 数据表文件本身就是主索引,且因为 InnoDB 数据文件需要按照主键聚集,所以使用 InnoDB 作为数据引擎的表需要有个主键,如果没有显式指定的话 MySQL 会尝试自动选择一个可以唯一标识数据的列作为主键,如果无法找到,则会生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

在这里插入图片描述
二、MyISAM

  1. 特点:该存储引擎管理非事务性表,提供高速存储和检索,支持全文搜索,表锁,索引仅仅保存数据记录的地址。
    在这里插入图片描述
    三、MEMORY

提供内存中的表,以前称为堆。它在RAM中处理所有数据,以便比在磁盘上存储数据更快地访问。用于快速查找引用和其他相同的数据。

四、MERGE

将多个类似的MyISAM表分组为一个表,可以处理非事务性表,默认情况下包括这些表。

五、EXAMPLE

你可以使用此引擎创建表,但不能存储或获取数据。这样做的目的是教开发人员如何编写新的存储引擎。

六、ARCHIVE

用于存储大量数据,不支持索引。

七、CSV

在文本文件中以逗号分隔值格式存储数据。

八、BLACKHOLE

受要存储的数据,但始终返回空。

九、FEDERATED

将数据存储在远程数据库中。

  1. MySQL表级锁的锁模式(MyISAM)
    MySQL表级锁有两种模式:表共享锁(Table Read Lock)和表独占写锁(Table Write Lock)。
  • 对MyISAM的读操作,不会阻塞其他用户对同一表请求,但会阻塞对同一表的写请求;
  • 对MyISAM的写操作,则会阻塞其他用户对同一表的读和写操作;
  • MyISAM表的读操作和写操作之间,以及写操作之间是串行的。
    当一个线程获得对一个表的写锁后,只有持有锁线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。
  1. innor的共享锁和排他锁
    对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制

  2. InnoDB行锁实现方式
    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!
    在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。

  3. 关于死锁
    MyISAM表锁是deadlock free的,这是因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么等待,因此不会出现死锁。但是在InnoDB中,除单个SQL组成的事务外,锁是逐步获得的,这就决定了InnoDB发生死锁是可能的。
    发生死锁后,InnoDB一般都能自动检测到,并使一个事务释放锁并退回,另一个事务获得锁,继续完成事务。但在涉及外部锁,或涉及锁的情况下,==InnoDB并不能完全自动检测到死锁,这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。==需要说明的是,这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下,如果大量事务因无法立即获取所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖垮数据库。我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。

发布了36 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/s_xchenzejian/article/details/104556750