Mysql学习笔记1 -- 基础理论

一、范式:

  • 第一范式:无重复的列;
  • 第二范式:每个实例都可以唯一标识;
  • 第三范式:数据无传递关系;

二、语言:

  • 数据定义语言(Data definition Language, DDL),CREATE TABLE;
  • 数据操纵语言(Data Manipulation Language, DML),SELECT、INSERT、UPDATE、DELETE;
  • 数据控制语言(Data Control Language, DCL)GRANT、REVOKE;

三、密码:

  • 修改密码:mysqladmin -u root -p password ”新密码“

四、事务:

关系型数据库需要遵循ACID规则,具体内容如下:

  1. > 原子性:事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部不起作用;
  2. > 一致性: 执行事务前后,数据保持一致;
  3. > 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. > 持久性: 一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该被其他任何影响。

为了达到上述事务特性,数据库定义了几种不同的事务隔离级别:

  1. > READ_UNCOMMITTED(未授权读取):最低的隔离级别,运行读取尚未提交的数据变更,可能会导致脏读、幻读 和 不可重复读;
  2. > READ_COMMITTED(授权读取):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读 或 不可重复读仍有可能发生;
  3. > REPEATABLE_READ(可重复读):对同一字段的多次读取结果都是一致的。除非数据是别本身事务自己所修改,可以阻断脏读 和 不可重复读,但幻读仍有可能发生;
  4. > SERIALIZABLE(串读):最高的隔离级别,完全服从ACID的隔离级别、所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止 脏读、不可重复读 以及 幻读。但是这将严重影响程序的性能。通常也不会用到该级别。

注意: Mysql默认采用 REPEATABLE_READ隔离级别,Oracle默认采用READ_COMMITTED隔离级别。

原理: 事务隔离机制的实现基于锁机制 和 并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读 和 回滚等特性。

 

五、脏读、幻读、不可重复读的区别:

  1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问 这个数据,然后使用了这个数据。
  2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读。例如,一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。如果 只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。
  3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。 如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

六、锁

MyISAM 和 InnoDB存储引擎使用的锁:

  • > MyISAM采用表级锁(table-level locking).
  • > InnoDB支持行级锁(row-level locking) 和 表级锁,默认为行级锁;

表级锁 和 行级锁对比:

  • > 表级锁:Mysql中锁定 颗粒最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定颗粒 最大,触发锁冲突的概率最高,并发度最低,MyISAM 和 InnoDB引擎都支持表级锁。
  • > 行级锁:Mysql中锁定颗粒最小 的一种锁,只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁类度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。

InnoDB存储引擎的锁的算法有三种:

  1. > Record lock:单个行记录上的锁;
  2. > Gap lock:间隙锁,锁定一个范围,不包括记录本身;
  3. > Next-key lock:record+gap 锁定一个范围,包含记录本身;

七、大表优化

当MySQL单表记录数过大时,数据库的CURD性能会明显下降,一些常见 的优化措施如下:

  • > 限制数据的范围: 务必禁止不带任何吸纳之数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内;
  • > 读/写分离:经典的数据库拆分方案,主库负责写,从库负责读;
  • > 缓存:使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
  • > 垂直分区:

根据数据库里面数据表的相关性进行拆分。例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。

简单来说垂直拆分是指数据表列的拆分,把一张列比较多的的表拆分为多张表。

垂直拆分的优点:可以使的行数据变小,在查询时减少读取的block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。

垂直拆分的缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂。

  • > 水平分区:

保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支持非常大的数据量。

水平拆分是数据表行的拆分,表的行数超过200W行时,就会变慢,这时可以把一张表的数据拆分成多张表来存放。举个例子:我们可以将用户信息拆分成为多个用户信息表。这样就可以避免单一数据量过大对性能造成影响。

水平拆分可以支持非常大的数据量存储,应用端改造也少,但 分片事务难以解决,跨界点Join性能较差,逻辑复杂。

注意: 数据库分片的两种常见方案:

  • 客户端代理:分片逻辑在应用端,封装在jar包中,通过修改 或者封装JDBC层来实现。当当网的sharding-JDBC、阿里的TDDL是两种比较常用的实现;
  • 中间件代理:在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。我们现在谈的Mycat、360的Atlas、网易的DDB等等都是这种建构的实现。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值