Mysql InnoDB

                                                 Mysql InnoDB存储引擎

存储引擎(基于表的,而不是数据库)

  1. InnoDB存储引擎 支持事务;特点:行锁设计、 支持外键,默认读取操作不会产生锁。默认的存储引擎;4种隔离级别,默认的是Repeatable级别。同时,使用next-keylocking策略避免幻读。 提供一致性的非锁定读、行级锁支持。
  2. MyISAM存储引擎 不支持事务、表锁设计、支持全文搜索。表级锁,并发情况下读没有问题,但并发插入的性能就要差一些;
  3. Memory存储引擎 将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据将消失。默认使用的是哈希索引;

 索引

    如果在创建表时没有显式的定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:

          1)、判断表中是否有非空的唯一索引(Unique NOT NULL),如果有 则该列即为主键(如果表中有多个非空唯一索引,会将建索引的顺序第一个为主键);

          2)、如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针;

常见的索引:

  1、B+Tree 索引:B+树索引并不能找到一个给定键值的具体行。B+树索引能找到的只是被查找数据行的所在的页。然后数据库通过把页读入到内存,再在内存中进行查询,最后得到要查找的数据。

     平衡二叉树:首先左子树的键值总是小于根的键值,右子树的键值总是大于根的键值;其次必须满足任何节点的两个子树的高度最大差为1。(维护一棵平衡二叉树的代价是非常大的)

     B+ 树(按主键顺序存放):是为磁盘或其他直接存取辅助设备设计的一种平衡查找树。在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。树的高度一般都在2-4层。

     B+树索引可分为:聚集索引、非聚集索引;不管是哪种,其内部都是B+树,即高度平衡,(聚焦索引)叶子节点存放着所有的数据。聚集索引和非聚集索引不同的是,叶子节点存放的是否是整行的信息。

     聚集索引(主键索引):按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页;(每张表只能有一个聚焦索引)它对于主键的排序查找和范围查找速度非常快。叶子节点的数据就是用户所要查询的数据。

    非聚焦索引(其他索引):叶子节点并不包含行记录的全部数据;叶子节点包含了键值+聚焦索引值(需要查询二次才能找到对应值)

    非聚焦索引(联合索引):是指对表上的多个列进行索引,也是一个B+树;键值都是排序的,通过叶子节点可以逻辑顺序地读出所有数据;如inx_a_b(a,b), 1)、where a=xx and b =xx 可以使用索引(a\b查询的顺序可以换,跟顺序无关),2)where a=1也是可以的。 3) where b = 1是不可以的。 

   非聚焦索引(全文索引)

   非聚焦索引(哈希索引)(自适应),会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引;

 

什么情况下使用索引 

      低选择性不适合建索引,如性别、地区、类型字段。高选择性的适合建索引,可通过show index 中cardinality预估值来观察是否适应,它的值应尽可能地接近1。

 

InnoDB存储结构 

      所有数据都被逻辑地存放在一个空间中,称之为表空间。表空间又由段、区、页组成;

     varchar(可变长长度的字符类型)最大存放65532字节(指所有varchar列的长度总和,如果列的长度总和超过这个长度,依然无法创建),utf-8字符集,一个汉字占三个字节,gbk字符集,一个汉字占两个字节;

    char(固定长度的字符类型)明确视为为了变长字符类型,对于未能占满长度的字符还是填充0x20。可以认为在多字节字符集的情况下,char与varchar的实际行存储基本是没有区别的。

   InnoDB存储引擎的数据是存放在页类型为B-tree node中。 B+Tree结构

   视图:是基于基表的一个虚拟表,用做一个抽象装置。

 

分区表(partition)

    分区的过程是将一个表或索引分解为多个更小、更可管理的部分。从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成,每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。

   Mysql数据库支持的分区类型为水平分区(指将同一表中不同行的记录分配到不同的物理文件中) ,mysql数据库的分区是局部分区索引,一个分区既存放了数据又存放了索引。而全局分区是指,数据存放在各个分区中,但是所有数据的索引放在一个对象中(目前不支持全局分区)。

  锁是数据库系统区别于文件系统的一个关键特征。锁机制用于管理对共享资源的并发访问。

  在数据库中,lock和latch都可以被锁为锁。

  1.   latch闩锁(轻量级锁),因为其要求锁定的时间非常短。若持续的时间长,则应用的性能会非常差。在Innodb引擎中,latch又分为mutex(互斥量)的rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。
  2. lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放,是有死锁机制的。

锁的类型

     两种标准的行级锁(如果一个事务T1已经获取了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容,但若有其他的事务T3想获得行r的排他锁,则其必须等待事务T1、T2释放行r上的共享锁-这种情况称为锁不兼容)。InnoDB存储引擎支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在。为了支持在不同粒度上进行加锁操作,InnoDB存储引擎支持一种额外的锁方式,称之为意向锁。

  1.  行级锁:允许事务读一行数据。
  2.  排他锁:允许事务删除或更新一行数据。
  3.  一致性非锁定读(默认InnoDB存储引擎):是指InnoDB存储引擎通过多版本控制的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行Delete和Update操作,这时读取操作不会因此去等待行上锁的释放。相反地,InnoDB存储引擎会去读取行的一个快照数据。快照数据是指该行的之前版本的数据,该实现通过undo段来完成。而undo用来在事务中回滚数据,因此快照数据本向是没有额外的开销。此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。

事务

   A原子性(atomicity)、C一致性(consistency)、I隔离性(isolation)、持久性(durablility)

事务隔离级别

   Read UnCommited

  Read Commited

  Repeatabled Read(默认)

  Serializabled

隔离级别隔离级别的值导致的问题
Read-Uncommitted0导致脏读
Read-Committed1避免脏读,允许不可重复读和幻读
Repeatable-Read2避免脏读,不可重复读,允许幻读(前、后两次读写内容一致)
Serializable3 串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重

脏读:一事务对数据进行了增删改,但未提交,另一事务可以读取到未提交的数据。如果第一个事务这时候回滚了,那么第二个事务就读到了脏数据。

不可重复读:一个事务中发生了两次读操作,第一次读操作和第二次操作之间,另外一个事务对数据进行了修改,这时候两次读取的数据是不一致的。

幻读:第一个事务对一定范围的数据进行批量修改,第二个事务在这个范围增加一条数据,这时候第一个事务就会丢失对新增数据的修改.(前后两次读取的记录数不一致)

总结:

     隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

    大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle

    少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值