数据库通关整理1-索引、聚簇索引、非聚簇索引、MyISAM和InnoDB、范式、主从复制

网上收集整理,仅供笔记参考学习

数据库通关整理1-索引、聚簇索引、非聚簇索引、MyISAM和InnoDB存储引擎、范式

数据库通关整理2-事务、并发问题、事务隔离级别、锁(S锁、X锁`)、乐观锁、悲观锁、sql注入、内连接、外连接

数据库通关整理3-Redis基础(数据库、缓存、消息中间件)、RDB、AOF、发布订阅、主从复制、哨兵模式、缓存穿透、缓存击穿、缓存雪崩


数据库

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。简单来说,数据库就是来存储数据信息的。

1.1 关系型数据库
采用了二维表格模型来组织数据的数据库。所谓的"关系型"可以理解为"表格"的概念, 一个关系型数据库由一个或数个表格组成。

常见的关系性数据库:Oracle、DB2、MySQL

1.2 非关系型数据库-NoSQL
常见的非关系型数据库:Redis、Neo4j

一、基本概念

  1. 超键、候选键、主键、外键
    超键: 在关系中能唯一标识元组的属性集称为关系模式的超键。比如身份证号。数据库中姓名可重复,所以不能是超键。
    候选键: 是最小超键,即没有冗余元素的超键。
    主键: 数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。
    外键: 另一个表的主键称此表的外键。

二、索引

2.1 索引的优点/缺点(为什么要建立索引)

优点:

(1)加快数据库的检索速度

(2)降低了插入、删除、修改等维护任务的速度

(3)唯一索引可以确保每一行数据的唯一性

(4)通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。

缺点:

  • 索引需要占物理和数据空间,即减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

2.2 什么字段适合建立索引

唯一、非空、经常被查询

2.3 什么时候用索引/不用索引

如果一张表更多是用于查询而很少插入,那么就可以建立尽量多的索引以优化查询性能。
相反如果一张表要经常插入或更新,则尽可能少用索引,有时甚至连主键都不建。

2.4 索引类型

1.唯一索引:字段值没有重复的值,如身份证号
2.非唯一索引:字段值有重复的值,如分数
3.主键索引:唯一索引的特定,创建主键时自动创建的索引
4.聚簇索引: 表中记录的物理顺序与键值的索引顺序相同。InnoDB存储引擎
5.非聚簇索引:MyISAM存储引擎
6.组合索引:多个字段而创建的索引。查询时需要包括索引的首列字段(比如联合索引col(A,B,C)在检索时,关键字必须含有A)。当含有范围的查询时,查询条件为首列+范围的字段
A>5 ORDER BY B ——范围查询在第一列,排序在第二列

2.4.1 索引创建原则
  1. 最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,范围查询会导致组合索引半生效。
  2. 尽量选择区分度高(字段不重复比例高)的字段作为索引
  3. 不在索引列做运算或者使用函数。会使索引失效
2.4.2 索引失效的情况

1.对于组合索引,必须由头字段,否则失效。
2.or 语句前后没有同时使用索引。要想使用 or,又想让索引生效,只能将 or 条件中的每个 列都加上索引。
3.如果列类型是字符串,那一定要在条件中使用引号引起来,否则不会使用索引 。
4.如果 mysql 估计使用全表描述比使用索引快,则不使用索引。
5.在索引列上做运算或者使用函数
6.以“%”开头的 LIKE 查询,模糊匹配。%在右边可以使用,在左边进行全表查询

2.5 索引的本质

索引时帮助MYSQL高效获取数据的排好序数据结构
,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

二叉树(二叉排序树/二叉搜索树)
红黑树(区别平衡二叉树)
B树
B+树

三、聚簇索引和非聚簇索引

3.1 聚簇索引优缺点

优点:是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。

缺点:对表进行修改速度较慢

3.2 聚簇索引适用场合

a.此列包含有限数目的不同值
b.排序和范围查找
c.查询的结果返回某值相同的大量结果集

3.3 聚簇索引和非聚簇索引对比

1.引都采用了B+树的结构。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然是索引节点。(非聚集索引的索引顺序和数据的物理存储顺序不相同,所以叶子节点不带数据)

2. 非聚集索引添加记录时,不会引起数据顺序的重组

四、MyISAM和InnoDB存储引擎

索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式
是不同的

4.1 MyISAM存储引擎

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。【这里我觉得可以理解为非聚簇索引
索引的存储顺序和数据的物理存储顺序不一致-----非聚簇索引
主索引Col1(主键,不可重复):
在这里插入图片描述
辅助索引Col2(字段可重复):
在这里插入图片描述

4.2 InnoDB存储引擎

InnoDB也使用B+Tree作为索引结构
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址
InnoDB中,这棵树的叶节点data域保存了完整的数据记录。InnoDB表数
据文件本身就是主索引
【聚簇索引】
主索引:
在这里插入图片描述
1.InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB 表生成一个隐含字段作为主键 ,类型为长整形。

2.在InnoDB上尽量采用自增字段做表的主键。因为,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效

3.辅助索引。InnoDB的所有辅助索引都引用主键作为data域。

辅助索引(Col3):
在这里插入图片描述
聚集索引这种实现方式使得按主键的搜索十分高效, 但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

为什么不建议使用过长的字段作为主键 ?
因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

4.3 MyIsam 与 InnoDB 的区别

1.事务处理上方面
MyISAM 强调的是性能,查询的速度比InnoDB 类型更快,但是不提供事务支持。InnoDB提供事务支持事务。

2.外键
MyISAM 不支持外键,InnoDB支持外键。

3.锁
MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认是行级锁,行锁大幅度提高了多用户并发操作的性能。innodb比较适合于插入和更新操作比较多的情况(支持事务),而 myisam则适合用于频繁查询的情况。另外,InnoDB 表的行锁也不是绝对的,如果在执行一个 SQL语句时,MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表,
例如 update table set num=1 where name like “%aaa%”。

4.表主键
MyISAM:允许没有主键的表存在。
InnoDB:如果没有设定主键,就会自动生成一个 6字节的主键(用户不可见)。

5. 查询表的具体行数
MyISAM:内置了一个计数器,可直接得到数据行数
InnoDB:不保存表的具体行数,要得到行数,需要扫描所有数据

四、数据库的三级范式

为了解决数据表之间的冗余

第一范式(1NF):属于第一范式关系的所有属性都不可再分,即数据项不可分。
第二范式(2NF):满足2NF必须先满足1NF。一个表只能说明一个事物,非主键属性必须完全依赖于主键属性。即非主属性都可以和主属性相关的

不符合第二范式的例子:
表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;
这个表明显说明了两个事物:学生信息, 课程信息

第三范式(3NF):在2NF的基础上,每列都与主键有直接关系,不存在传递依赖。任何非主属性不依赖与其他非主属性。
例如A(学号) ----> B(非主属性) ----> C

五、如果有一个特别大的访问量到数据库上,怎么做优化?

三种方法:

5.1 优化查询

  1. 使用索引
  2. 优化SQL语句
    使用关键字explain、limit等
  3. 数据库表
    表拆分、中间表
  4. 硬件优化
  5. MySQL参数优化
  6. 数据库连接池、缓存

5.2 主从复制,读写分离,负载均衡

统数据库如Mysql,存在的问题就是单机部署,单进程。

主从复制:通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力

读写分离:Web 服务器在写数据的时候,访问主数据库(Master),主数据库通过主从复制机制将数据更新同步到从数据库(Slave),这样当 Web服务器读数据的时候,就可以通过从数据库获得数据。
优点:
1.主数据库只需要承受少量的写数据,读数据在从数据库
2.数据热备份
在这里插入图片描述

5.2.1 主从复制原理

(1)master 将数据改变记录到二进制日志(binary log)中,Slave服务器中有一个I/O线程(I/O Thread)在不停地监听Master 的二进制日志是否有更新:如果没有,它会睡眠等待 Master 产生新的日志事件;

(2)如果有新的日志事件(Log Events),则会将其拷贝至 Slave 服务器中的中继日志

(3)slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中,所 以两端的数据是完全一样的。

5.2.2 主从复制方式

1.同步复制:是否等待验证复制成功
2.异步复制:不用等待验证
3.半同步复制:验证一台服务器

5.3 数据库分表,分区,分库

分表:水平拆分、垂直拆分
分区:把一张表的数据分成多个区块,提高磁盘I/O读写性能
分库:是根据业务不同把相关的表切分到不同的数据库中,比如web、bbs、blog等库

猜你喜欢

转载自blog.csdn.net/weixin_45773603/article/details/108169813