数据库MySql

十七、MySql

164.数据库的三范式是什么?

第一范式( 1NF): 字段具有原子性,不可再分。 所有关系型数据库系统都满足第一范式)
数据库表中的字段都是单一属性的, 不可再分。 例如, 姓名字段, 其中的姓和名必须作为一
个整体, 无法区分哪部分是姓, 哪部分是名, 如果要区分出姓和名, 必须设计成两个独立的
字段。
第二范式( 2NF):
第二范式( 2NF) 是在第一范式( 1NF) 的基础上建立起来的, 即满足第二范式( 2NF) 必
须先满足第一范式( 1NF)。
要求数据库表中的每个实例或行必须可以被惟一地区分。 通常需要为表加上一个列, 以存储
各个实例的惟一标识。 这个惟一属性列被称为主关键字或主键。
第二范式( 2NF) 要求实体的属性完全依赖于主关键字。 所谓完全依赖是指不能存在仅依赖
主关键字一部分的属性, 如果存在, 那么这个属性和主关键字的这一部分应该分离出来形成
一个新的实体, 新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,
以存储各个实例的惟一标识。 简而言之, 第二范式就是非主属性非部分依赖于主关键字。
第三范式的要求如下:
满足第三范式( 3NF) 必须先满足第二范式( 2NF)。 简而言之, 第三范式( 3NF) 要求一个
数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1, 每一列只有一个值
2, 每一行都能区分。
3, 每一个表都不包含其他表已经包含的非主关键字信息

165.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?

一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(文中提到的)MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。

但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。

注:如果在这7条记录里面删除的是中间的几个记录(比如删除的是3,4两条记录),重启MySQL数据库后,insert一条记录后,ID都是8。因为内存或者数据库文件存储都是自增主键最大ID

166.如何获取当前数据库版本?

使用 select version() 获取当前 MySQL 数据库版本。

167.说一下 ACID 是什么?

Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,
不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,
就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
 
Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
 
Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,
隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,
包括读未提交(Read uncommitted)、读提交(read committed)、
可重复读(repeatable read)和串行化(Serializable)。
 
Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

168.char 和 varchar 的区别是什么?

CHARVARCHAR都是字符串类型,它们的具体区别为:

长度大小区别:

  • CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间;
  • VARCHAR(M)定义的列的长度为可变长,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。

存数据时的区别:

  • CHAR值存储时,如果字符数没有达到定义的位数,会在后面用空格补全,再存入数据库中。比如定义 CHAR(10),那么不论存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充;
  • VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充

取数据时的区别:

  • 数据库取CHAR值时,尾部的空格会被删除;
  • 数据库取VARCHAR值时,尾部的空格仍然保留

169.float 和 double 的区别是什么?

float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。
 
double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。

170.mysql 的内连接、左连接、右连接有什么区别?

1.当进行内连接时,系统会自动忽略两个表中对应不起来的数据:Inner join

2.左链接,显示关键词left左边表中的所有数据,右边表数据数据少了补NULL值,数据多了不显示; left join

  同理,右链接是以右边为参照,左边少了补NULL,多了删除,这里就不多说了;

以上可以得出:

  1.内连接,显示两个表中有联系的所有数据;

  2.左链接,以左表为参照,显示所有数据;

  3.右链接,以右表为参照显示数据;

171.mysql 索引是怎么实现的?

InnoDB索引实现
使用B+树作为索引结构,数据文件本身就是索引文件。

MyISAM索引实现
同样也是使用B+树作为索引结构,叶子节点data域存储的是数据记录的地址。数据文件和索引文件是分别存储在xxx.MYD和xxx.MYI(xxx表示数据表名),索引文件xxx.MYI保存数据记录的地址。

172.怎么验证 mysql 的索引是否满足需求?

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。explain 语法:explain select * from table where type=1。

173.说一下数据库的事务隔离?

4个事务隔离级别:

  • Read uncommitted (读未提交):最低级别,以上问题均无法解决。
  • Read committed (读已提交):读已提交,可避免脏读情况发生。
  • Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。
  • Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可避免脏读、不可重复读、幻读情况的发生。

在这里插入图片描述

 

174.说一下 mysql 常用的引擎?

1. InnoDB

InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。

InnoDB 中存在表锁和行锁,不过行锁是在命中索引的情况下才会起作用。

InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读;而在 Oracle 数据库中,只支持串行化级别和读已提交这两种级别,其中默认的为读已提交级别。

2. Myisam

Myisam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。

Myisam 只支持表锁,且不支持事务。Myisam 由于有单独的索引文件,在读取数据方面的性能很高 。

3. 存储结构

InnoDB 和 Myisam 都是用 B+Tree 来存储数据的。

175.说一下 mysql 的行锁和表锁?

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

176.说一下乐观锁和悲观锁?

乐观锁:每次去获取数据的时候都认为别人不会修改,不会上锁,但是在提交修改的时候会判断一下在此期间别人有没有修改这个数据。
悲观锁:每次去获取数据的时候都认为别人会修改,每次都会上锁,阻止其他线程获取数据,直到这个锁释放。

MySQL 的乐观锁需要自己实现。一般在表里面添加一个 version 字段,每次修改成功值加 1;每次其他字段值的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就可以返回失败也可以进行重试。

MySQL 的悲观锁,以 Innodb 存储引擎为例,将 MySQL 设置为非 autoCommit 模式

177.mysql 问题排查都有哪些手段?

  • 使用 show processlist 命令查看当前所有连接信息。
  • 使用 explain 命令查询 SQL 语句执行计划。
  • 开启慢查询日志,查看慢查询的 SQL。

178.如何做 mysql 的性能优化?

  • 为搜索字段创建索引。
  • 避免使用 select *,列出需要查询的字段。
  • 垂直分割分表。
  • 选择正确的存储引擎。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值