MySQL的并发控制:

并发控制:

mysql提供两个级别的并发控制:

  • 服务器级(the server level)
  • 存储引擎级 (the storage engine level)

并发即指在同一时刻,多个操作并行执行。
MySQL对并发的处理主要应用了两种机制——是"锁"和"多版本控制"。
加锁是处理并发的基本方法

MySQL中锁的粒度(锁的级别):

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
  3. 页级锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  • MyISAMMEMORY存储引擎采用的是表级锁(table-level locking);
  • BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁
  • InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁

锁策略:
就是在 锁的开销和数据的安全性之间寻求平衡,大多数商业数据库都是在表上直接添加行级锁并以各种复杂的方式实现以便在锁比较多的情况下提供更好的性能;
而MySQL提供了多种存储引擎,都可以实现自己的锁策略和锁粒度,把锁粒度固定在某个级别,为某种特定的应用场景提供更好的性能

读写锁:
在处理并发读写操作时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题,这两种锁通常被称为"共享锁" 和 “排他锁” 也叫读锁写锁;

  • 读锁是共享的 ,也可以说是相互不阻塞的,多个用户在同一时刻读取同一资源是相互不干扰的;
  • 写锁是排他的,一个写锁会阻塞其他写锁和读锁,确保在给定时间内只有一个用户在写入,防止其他用户在写入的同时执行读操作;读取正在写入的资源;

MySQL的存储引擎:

常见存储引擎:

  • MyISAM、
  • InnoDB、
  • MERGE、
  • MEMORY(HEAP)、
  • BDB(BerkeleyDB)等

其中常用存储引擎为:innoDB,MyLSAM

InnoDB 存储引擎(MySQL5.5及以后版本默认使用)

特性:

  • 灾难恢复性好
  • 支持事务
  • 使用行级锁
  • 支持外键关联
  • 支持热备份
  • 对于InnoDB引擎中的表,其数据的物理组织形式是簇表(Cluster Table),主键索引和数据是在一起的,数据按主键的顺序物理分布
  • 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取

MEMORY存储引擎

特性:

  • 提供内存表
  • 不支持事务和外键
  • 显著提高访问数据的速度,
  • 可用于缓存会频繁访问的、可以重构的数据、计算结果、统计值、中间结果。

缺点

  • 使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈
  • 只支持固定大小的行。Varchar类型的字段会存储为固定长度的Char类型,浪费空间
  • 不支持TEXT、BLOB字段。当有些查询需要使用到临时表(使用的也是MEMORY存储引擎)时,如果表中有TEXT、BLOB字段,那么会转换为基于磁盘的MyISAM表,严重降低性能
  • 由于内存资源成本昂贵,一般不建议设置过大的内存表,如果内存表满了,可通过清除数据或调整内存表参数来避免报错
  • 服务器重启后数据会丢失,复制维护时需要小心

MyISAM引擎

特性

  • 不支持事务
  • 使用表级锁,并发性差
  • 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
  • 可以配合锁,实现操作系统下的复制备份、迁移
  • 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
  • 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能

MySQL存储引擎MyISAM与InnoDB的区别

1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用

3)InnoDB支持外键,MyISAM不支持

4)从MySQL5.5.5以后,InnoDB是默认引擎

5)InnoDB不支持FULLTEXT类型的索引

6)InnoDB中不保存表的行数,如select count() from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时MyISAM也需要扫描整个表。

7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。

8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。

9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’