【数据库】Mysql基础

1.union 和union all的区别

  • union会对结果集进行处理排除掉相同的结果
  • union all 不会对结果集进行处理,不会处理掉相同的结果

2.preparedStatement和statement的区别

  • 任何时候使用preparedStatement而不是statement
  • PreparedStatement预编译,防止SQL注入
  • PreparedStatement多次使用可提高效率

3.数据库三范式

  • 第一范式(1NF)无重复的列(原子性),每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
  • 第二范式(2NF)属性完全依赖于主键,如果有哪些数据只和主键的一部份有关的话,它就不符合第二范式。
  • 第三范式(3NF)属性不依赖于其它非主属性,每个非关键字列都独立于其他非关键字列。

4.Mysql行级锁

MYISAM引擎只支持表级锁,而INNODB引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的:

⑴ 共享锁

又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改。
如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。

SELECT ... LOCK IN SHARE MODE;

会对查询出的每一条数据加共享锁,如果其它线程再加排它锁就会阻塞。

⑵ 排它锁

又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的锁。获准排他锁的事务既能读数据,又能修改数据。

SELECT ... FOR UPDATE;

在查询语句后面增加FOR UPDATE,Mysql会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。

5.事务的基本要素(ACID特性)

  • 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  • 一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  • 隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  • 持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

6.事务的并发问题

  • 脏读 对于两个事务T1 和T2 , T1 读取了已经被T2 更新但还没有被提交的字段。之后,若T2 进行回滚,T1读取的内容就是临时且无效的
  • 不可重复读 是指在一个事务中两次读同一行数据,可是这两次读到的数据不一样
  • 幻读 系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

7.事务的隔离级别

  • 读未提交(Read Uncommitted)事务A读到事务B未提交的事务
  • 读已提交(Read Committed)事务A只能读到B已提交的事务(ORACLE等默认)
  • 可重复读取(Repeatable Read)在同一个事务内的查询都是事务开始时刻一致的
  • 序列化(Serializable) 事务串行化执行,你读的时候别人都看不到

8.数据库查询语言分类

⑴DQL(Data Query Language)

数据查询语言DQL由SELECT子句,FROM子句,WHERE子句组成

⑵DML(Data Manipulation Language)

数据操纵语言DML包含INSERT,UPDATE,DELETE

⑶DDL(Data Definition Language)

数据定义语言DDL用来创建数据库中的各种对象-----表、视图、
索引、同义词、聚簇等如:
CREATE TABLE/VIEW/INDEX/SYN/CLUSTER
DDL操作是隐性提交的!不能rollback

⑷DCL(Data Control Language)

数据控制语言(DCL)是用来设置或者更改数据库用户或角色权限的语句,这些语句包括GRANT、DENY、REVOKE等语句,在默认状态下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成员才有权利执行数据控制语言。

9.mysql导出表结构

 sudo mysqldump -h10.1.210.15 -u用户名 -p密码 数据库名 device_bind_info>device_bind_info.sql
 格式:
 sudo mysqldump -h地址 -u用户名 -p密码 数据库名 表名>导出sql

10.乐观锁和悲观锁

  • 每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
  • 悲观锁每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

猜你喜欢

转载自blog.csdn.net/cheidou123/article/details/93905153