最完整的MySQL知识!掌握MySQL知识

MySQL

约束

用于限制表中的数据,保证表中数据的准确和可靠。

  1. not null 非空,不能为null。
  2. default 默认,用于保证该字段有默认值。
  3. primary key 主键,用于保证唯一性。
  4. unique 唯一,但是可以为null。
  5. foreign key 外键,用于限制两个表的关系,在从表添加外键,用于引用主表中的值。

超键、候选键、主键、外键

超键

在关系模式中,能够唯一标识元组的属性集称为超键。
比如:学生(学号,姓名,性别,专业编号,年龄)
其中可以通过学号来确定一名学生,但是通过姓名不能,同理其他,因此满足超键的定义有:(学号)、(学号,姓名)、(学号,专业编号)、(学号,年龄)等等。

候选键

在关系模式中,能够唯一标识元组并且不含多余属性的属性集。
同理推导出:(学号)、(姓名)、(学号,姓名)。

主键

在若干个候选键中制定一个为关键字,则此关键字就是主键。

外键

关系模式中,r1的某属性不是r1的候选键,但是r2的候选键,这个属性对r1来说就是外键。

为什么不使用外键

外键虽然可以使得表间数据变得完整,但是当面对海量数据时,如果存在外键会出现很多问题,比如外键约束问题,即存在一张A表,表中有一个数据是外键,也就是说这个数据是另一张表B的候选键,那么对A表进行添加时,还需要去查询B表是否有这个外键数据,如果不存在就无法插入,同时当我们去操作B表时就需要获取额外的锁,如果在大量数据下就会造成死锁。

扫描二维码关注公众号,回复: 12444971 查看本文章

事务

事务是指对数据库的一系列的操作,事务要么失败,要么被提交(成功)。

ACID

原子性:只有事务中的所有的数据库操作都执行成功,才算整个事务成功。事务中任何一个SQL执行失败,已经执行成功的SQL语句也必须撤销,回到执行事务的之前的状态。

一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,比如a和c各有100元,a给c转了50,那么砖完后a和c的和还是200。

隔离性:指一个事务的执行不能被其他事务干扰,即一个事务内部的操作以及使用的数据对并发的其他事务是隔离的。

持久性:一个事务一旦被提交,它对数据的改变就是永久性的。

隔离级别

当同时有多个事务对数据库中相同的数据进行操作时,如果没有相应的隔离机制,就会导致各种并发问题。

  1. 读未提交:会导致所有事物可以获取到其他还没有提交的事物的执行结果,读取没有提交的事务被称为脏读,也就是说当a和b都在操作数据时,a在操作数据中途回滚了,但是b已经读取到变化的数据造成错误。
  2. 读提交:一个事务只能获取已经提交的事务,这样就解决了脏读,但还是会造成不可重复读,也就是a操作数据时,b读取的结果和a事务提交后b再读取的结果不一样,造成在同一事务中的查询同样数据的结果不一样,同样还是会导致幻读。
  3. 可重复读:MySQL的默认隔离级别,解决了不可重复读和脏读,但还是会导致幻读,比如a要修改整个表的数据,但是没有及时提交,这时b插入内容并提交,那么这时a修改时就会发现新的内容造成幻觉。在可重复读中,该sql第一次读取到数据后,就将这些数据加锁(悲观锁),其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。
  4. 序列化:通过强制事物排序,从而解决幻读,也就是比如3中,当b想要插入时,系统就会自动让其等待a事务执行完再继续执行,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,在这个级别上会导致大量的超时现象和锁竞争,所以性能十分低下。

在这里插入图片描述

范式

范式是指符合某一关系模式的集合。

1NF
表中每一列都是不可再分的,列的原子性。
比如下列这样设计的数据表就不符合。
在这里插入图片描述
正确的:
在这里插入图片描述
1NF是所有关系型数据库的最基本要求,但是仅仅符合1NF的设计,任然会存在数据冗余大、插入异常等。比如下表中,系主任和系名就存在大量的重复数据。假如学校新建了一个系,但是暂时还没有招收任何学生(比如3月份就新建了,但要等到8月份才招生),那么是无法将系名与系主任的数据单独地添加到数据表中去的——插入异常

假如将某个系中所有学生相关的记录都删除,那么所有系与系主任的数据也就随之消失了(一个系所有学生都没有了,并不表示这个系就没有了)——删除异常

假如李小明转系到法律系,那么为了保证数据库中数据的一致性,需要修改三条记录中系与系主任的数据——修改异常
在这里插入图片描述
在这里插入图片描述
2NF

首先明白完全依赖和部分函数依赖,比如 学号 F→ 姓名,(学号,课名) F→ 分数 ,需要同时学号和课名才能确定分数,这样就叫完全依赖,(学号,课名) P→ 姓名,这样其实只需要学号就能确定姓名的就叫部分依赖。

2NF就是在1NF的基础上,提出一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分,消除了非主属性对于码的部分函数依赖

这样上表就应该变为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3NF

传递函数依赖,Z→Y,Y→X =Z→X。

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

在这里插入图片描述

主从复制

读写分离:在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。
做数据的热备,主库宕机后能够及时替换主库,保证业务可用性。

流程
在这里插入图片描述

  1. update、delete、insert操作都会写进binlog中(binlog是一种二进制日志文件)。
  2. slave发起连接,连接到master。
  3. matser创建binlog dump线程将binlog传输给slave。
  4. slave会创建一个I/O线程,将binlog写入到relay log。
  5. slave还会创建一个SQL线程,将relay log中的SQL执行一遍使得主从同步。

读写分离

读写分离是建立在主从复制上的,由于matser只需要复制upate、delete、insert,而select操作可以交给slave,实际中查询数据的次数比修改次数多,这样可以减轻服务器压力。

实现可以使用mycat。
在这里插入图片描述

锁机制

数据库中锁大致可以分为:

  1. 共享锁:其他事务可以读,但不能写。
  2. 排他锁:其他事务不能读和写。

按照粒度分可为:

  1. 行锁:粒度最小,每次只锁一行,并发高,加锁慢且开销大,会产生死锁。
  2. 表锁:每次锁住整张表,加锁快且开销小,粒度大,不会出现死锁,并发低。
  3. 页面锁:每次锁相邻的一组记录,开销和加锁时间处于行锁和表锁之间,并发一般。

MySQL中不同的存储引擎支持不同的锁机制,MyISAM采用表锁,Innodb默认使用行锁,也支持表锁。

MyISAM锁

● 表共享读锁 (Table Read Lock):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
● 表排他写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作;

在默认情况下,写锁的优先级高于读锁,当锁释放后优先给写锁等待队列。所以MyISAM不适合高并发,大量的写操作会导致读操作很难获得执行,使其一直处于饥饿。

Innodb锁

Innodb引入意向锁概念:当一个线程对某行进行修改,如果另外一个请求要对全表修改,那么就需要对全表扫描排除有行被锁定,引入意向锁后,对一行进行修改时,会先给表加意向互斥锁,再给行添加互斥锁,这时其他对表修改时就需要等到意向互斥锁释放。

1、意向共享锁
    预示事务有意向对表中的某些行加共享S锁
2、意向排他锁
    预示着事务有意向对表中的某些行加排他X锁

索引

索引就是帮助MySQL快速获取数据的数据结构,也就是排好序的数据结构

MySQL使用b+ tree存储数据。下面列出其他数据结构的缺点:(学习数据结构的实用网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

二叉树缺点:在线性增长的情况下,二叉树就已经退化为链表了,查询效率很低。
在这里插入图片描述
红黑树缺点:红黑树一种平衡搜索二叉树,它会自动保持左右两端平衡,红黑树在海量数据下,整棵的树会非常高,造成的IO非常多,那么查询的性能还是低。
在这里插入图片描述
b tree:b tree 可以在横向不断添加数据,这样树的高度就不会太高,每一页设置为16kb。
在这里插入图片描述
b+ tree:在b tree上优化了两点,第一点将数据都存在叶子节点上,第二点在叶子节点上增加双向指针,这样将数据都放在叶子节点上,就有更多的空间存储数据,同时MySQL中的叶子节点是排好序的。

在这里插入图片描述
hash:当使用范围查找时,hash没办法实现,只有扫描全表,同时消耗内存高。

索引覆盖

就是select的列要在所建的索引覆盖,这样就能避免回表,所以尽量少使用 select *。
一般实现索引覆盖,通过建立联合索引来将select的列包含在索引中。
在这里插入图片描述

索引下推

不使用索引下推时,使用非主键索引进行查询,数据返回给server端,server端判断其是否符合条件。在使用索引下推时,这个判断会在存储引擎就完成,这样可以优化减少查询表的次数,同时减少server与引擎的交互次数。
在这里插入图片描述

慢查询日志

MySQL提供的日志工具,专门用于记录查询时间超过阀值得语句,阀值变量long_query_time,默认下为10s,默认下不开启慢查询功能。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/TheCarol/article/details/113064232