MySQL相关基础知识

1.事务

事务是数据库中一个单独的执行单元。单元中每个sql语句都是互相依赖的,任何一句执行失败整个单元都会回滚,回到最初的状态。

  • 事务的四大特性(ACID):
  1. 原子性:事务包含的所有操作要么全成功,要么全失败回滚。
  2. 一致性:事务执行前后都必须处于一致性状态(如ab共五百块,不管怎么交换,最终钱加起来还是500块)
  3. 隔离性:多个并发事务之间要相互隔离开(如两个事务,对于1来说,2要么在1开始之前开始,要么在1结束后开始)
  4. 持久性:数据的变化是永久性的
  • 事务隔离级别:读未提交、读已提交、可重复读、串行化。

2.查询的数据很多,怎样提高查询效率

  • 数据库设计方面

    建立索引、分区、选取最适用的字段属性(减少字段宽度和使用固定长度的字段)

  • 数据库I/O方面

    增加缓冲区、如果涉及表的级联,最好将不同表放在不同的磁盘,增加I/O速度

  • Sql语句方面

    优化sql语句,减少比较次数、限制返回的条目数(limit)、如果可能保证数据的完整性,尽量不使用外键(外键会影响插入和删除性能)

  • java方面

    如果有重复使用的查询,最好用哪个preparedstatement,因为他是预编译的,只要运行就好

3.范式

  • 第一范式:原子性,意思就是说,表不可以拆分,即一列只有一个值。
  • 第二范式:满足第一范式的基础上,每一行均能被唯一的区分,存储唯一标识的列即为主键列。
  • 第三范式,建立在第二范式基础上,不包含其他表中非主属性以外的关键字信息。非主属性对码不存在部分依赖,也不存在传递依赖。
  • BCNF:不存在关键字段决定关键字段的情况。如(仓库号,管理员号)。可以依据两个字段,将表拆成管理表和仓库表两个表。
  • 第四范式:表中最多只有一个多值事实。如(员工号,孩子姓名,职工选修课程),一个员工可以有多个孩子,一个员工也可以选多门课程,因此存在两个多值依赖,不符合4NF,可以拆分成两个表,每个表中有一个多值事实。

4.Union与Union all

Union在合并时会去除重复元素,而Union all是简单的合并,并不去除重复元素,因此效率要更高。在没有重复数据的情况下用Union all。

5.数据库引擎

扫描二维码关注公众号,回复: 2196429 查看本文章
  • InnoDB:提供提交、回滚、崩溃恢复能力的事务安全能力,实现并发控制(支持事务、支持行级锁、支持MVCC--多版本并发控制、支持外键、不支持全文索引)

       四大特性:插入缓冲、二次写、自适应哈希索引、预读

  • MyISAM:插入查询效率很高,主要用于插入和查询(不支持事务、支持表级锁、不支持MVCC、不支持外键、支持全文索引)  (内部维护计数器)
  • memory:用于存放临时数据,数据量不大且安全性要求不高
  • archive:如果只有插入和查询可用,支持高并发的插入操作,但本身不是事务安全的

6.InnoDB事务与日志的实现方式

  • 查询日志:记录所有对数据库的请求(不管是否被正确执行)
  • 二进制日志:记录所有对数据库的修改操作
  • 慢日志:设置一个阈值,运行时间超过该阈值的所有SQL语句都记录到慢日志中
  • 错误日志:记录出错信息,一些警告信息或者正确信息。

实现方式:事务日志是通过redo和InnoDB的存储引擎日志缓冲来实现

7.MySQL的三级模式

  • 模式(逻辑模式):是数据库中全体数据逻辑结构和特征的描述,是用户的公共逻辑视图
  • 外模式(用户模式):是数据库用户的数据视图,是局部数据的逻辑结构和特征的描述
  • 内模式(存储模式):一个数据库只有一个内模式。是物理结构和存储方式的描述,是数据在数据库内部的表示方式

8.基本命令

  • 表:creat、alter、drop
  • 数据库:select、inset、delete、update
  1. select 属性 from 表名 where...
  2. insert 属性 into 表名 values()
  3. delete from 表名 where...
  4. update 表名 set ...

9.连接

  • 内连接:两个表共有的数据(Inner Join 默认是Inner Join,可以省略Inner)
  • 左连接:左面表数据为基准,右面没有的补空(从左表返回所有行)
  • 右连接:右面数据为基准,左面没有的补空(从右表返回所有行)
  • 全连接:返回所有行,不存在的补空

10.Join与Union

  • Union是合并两个或多个select语句的结果集,要求select语句的列数相同,且顺序相同,属性必须有相似的数据类型。结果默认的属性名为第一个select中的属性名。Union默认返回不重复的数据,如果需要显示重复的数据,用Union All
  • Join用于将两个表或多个表通过键连起来,获取更完整的结果。

11.MySQL中的视图和表

区别:

  • 视图是一些预编译的Sql语句,是基于SQL语句结果集的可视化的表
  • 视图是虚表,表是实表
  • 视图不占用物理存储空间,而表占用物理空间
  • 视图的修改只能通过创建语句实现,而表可以通过语句在任何时候修改
  • 对视图的简历和删除智慧影响视图本身,不会影响对应的表
  • 视图没有实际的物理记录,而表有
  • 视图是窗口,而表是内容
  • 视图可以防止用户直接接触表,因而用户不知道表结构

联系:

  • 视图是建立在表之上的虚表,视图依据表的存在而存在,一个视图可以对应多个表。
  • 对视图中数据的删除会影响表中的数据。

12.存储过程和函数

  • 存储过程是预编译的Sql语句,用户可以调用存储过程直接执行。函数必须要用括号包住输入的参数,且不能使用临时变量,必须使用表变量。
  • 存储过程可以作为独立的一部分来执行,而函数必须作为查询语句的一部分来调用,由于函数可以返回一个表对象,因此他可以出现在from关键字的后面。
  • 存储过程不支持return语句,但可以通过output参数返回多个值。函数可以通过return语句返回多个值。
  • 存储过程执行速度比较快,因为在创建的时候已经在服务器上进行了编译。

13.触发器

触发器是一种特殊的存储过程,不过他由事件触发,并不是程序调用或者手工启动。由数据库服务器自动激活。

类似于约束,但比约束更加灵活,可以实施比约束更加复杂的检查和操作。

触发器有两种:DML触发器(普通的 INSERT / UPDATE / DELETE 触发器)和DLL触发器(一些特有的 DDL 语句的触发器)。

DML触发器是数据库服务器发生数据库操作语言事件时执行的存储过程,分为after和instead of。after是在记录改变之后进行,instead of是在记录改变之前执行触发器本身定义的操作而不是执行原来sql语句里的操作。

DLL触发器是在响应数据定义语言事件是执行的存储过程。

14.事务隔离级别

  • 未提交读(read uncommitted):即使对数据库的修改没有提交,对其他事务也可见(脏读、不可重复读、幻读)
  • 读已提交(read committeed):大多数数据库默认的隔离级别,解决了脏读,但是一个事务执行两次同样的查询,可能得到不同的结果。(不可重复读、幻读)
  • 可重复读(repeatable read):mysql默认的隔离级别。保证一个事务多次读取同样的记录结果是一致的。(幻读)innodb通过多版本并发控制(MVCC)解决了幻读的问题。
  • 串行化(serializable):强制事务串行执行,在每一行上均加锁,因此会导致大量超时与锁争用问题。

15.关系数据库的特点

  • 数据结构化:整个数据库按一定的结构形式构成,数据在记录内部和记录类型之间相互关联
  • 数据冗余度小:数据是面向整个系统,数据统一定义、组织和存储,集中管理,避免了不必要的冗余
  • 数据独立性高:数据库中的数据独立于应用程序
  • 数据共享性好:数据库中数据可以供多个用户使用,不同用户可以同时存取数据而不相互影响
  • 数据集中控制:集中控制、维护、管理有关数据。(文件管理方法中,文件是分散的,每个用户和每种处理都有各自的文件,不同文件之间是没有联系的,因此不能按照统一的方法来控制、维护和管理)
  • 统一的数据保护功能:多用户共享数据的情况下,对用户使用数据有严格的检查,拒绝非法用户进入数据库,保证数据的安全性、一致性和并发控制

16.三个线程(MySQL复制原理及流程)

  • 主:binlog线程,记录所有改变了数据库数据的语句,放到master下的binlog中。
  • 从:io线程,在使用start slave之后,负责从master上拉取binlog内容,放进自己的relay log中
  • 从:sql执行线程,负责执行relay log中的语句

17.delete、truncate、drop

  • delete可以删除表中数据,可加where子句;truncate可以删除表中的数据,在插入时,自增id从1开始;drop用于删除表
  • delete删除时,不会改变原来表或索引所占用的空间;truncate删除后,会将表或索引所占空间回复到原始大小;drop会将表所占的空间全部释放
  • delete每次删除一行,在插入时从原来计数值基础上变化;truncate删除表中所有行,但表的结构、约束、索引等保持不变,计数值回复到初始1;drop是删除表定义和数据

delete与truncate:

  • delete可以加where,可以用于删除数据也可用于删除视图;而truncate止咳用于删除数据;
  • 删除数据时,delete每次删除一行,并将删除操作作为事务记录在日志日志中便于回滚,因此删除苏读可能会慢一些;而truncate删除数据时,并不把单独的删除操作记录到日志中保存,删除行是不能回复的,删除苏读要快

18.索引

索引的实现通常使用B树或其变种B+树。

B-树:一个节点占一页。每个非叶节点存储两个键值(以及数据)和三个指针,键值升序排列,三个指针对应于两个键值的三个区间,指向子树的根节点,指针存储的是子节点所在磁盘的块地址。

B+树:考虑到数据过大,节点存储的key值数量很少,B+树将所有数据按照键值大小存储在叶节点中,节点之间有一个链指针,非叶节点只存储key(按大小排序存储)和指针。InnoDB用B+树实现其索引结构。B+树分为主键索引和辅助索引,主键索引是叶节点包含所有的数据,而辅助索引叶节点不包含所有数据,而是存储相应行数据的聚集索引键。

建立索引的原则:

  • 在经常使用查找的列上建立索引:加快搜索速度
  • 在主键列上建立索引:强制数据的唯一性以及组织表中数据的排列结构
  • 在经常连接的列(外键)上建立索引:加快连接速度
  • 在使用where子句的列上建立索引:加快条件判断的速度
  • 在经常需要根据范围搜索的列上建立索引:因为索引已经排好序,其指定的范围是连续的

不能建立索引:

  • 对应列数值很少
  • 对应列的类型为text、image、bit等
  • 在查询中很少使用的列
  • 修改的性能远远大于检索性能时

数据库设计器中创建三种索引:

  • 唯一索引:不允许任何两行有相同的索引值
  • 主键索引:在数据库关系图中建立主键将自动的创建主键索引,主键索引是唯一索引的特殊类型
  • 集聚索引:聚集索引表中行的物理顺序与键值的(索引)逻辑顺序相同。

猜你喜欢

转载自blog.csdn.net/xuebaobao130526/article/details/79702080