MySQL相关的一些问题


一、数据库的三范式是什么?

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式:任何非主属性不依赖于其它非主属性。

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

如果mysql引擎是innodb,那么此时id是6;
如果mysql引擎是MyISAM则此时的id是8;
InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。自增主键从1开始。

三、如何获取当前数据库版本?

使用sql: select version()

四、说一下 ACID 是什么?

A:原子性
一个事务中的所有操作全部完成,或全部不完成,不会存在中途中断的问题。如果事务操作出现异常,会会滚回未提交事务之前。
C:一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
I:隔离性
数据库拥有允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
D:持久性
事务处理结束后,对于数据的修改就是永久的,即便系统故障也不会丢失。

五、char 和 varchar 的区别是什么?

char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。
char 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。
varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。

六、float 和 double 的区别是什么?

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

七、MySQL 的内连接、左连接、右连接有什么区别?

内连接关键字:inner join;左连接:left join;右连接:right join。
内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

八、MySQL 索引是怎么实现的?

索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所以索引的性能也是更好的。

九、怎么验证 MySQL 的索引是否满足需求?

1、通过explain查看执行计划来验证
2、通过比较加索引查和不加索引查两者之间耗时的差别来验证

十、说一下数据库的事务隔离?

read-uncommited: 未提交读
事务未提交前其它事务就能对数据库进行操作,这样会导致脏读,不可重复读和幻读
Read-commited:提交读
事务提交之后其它事务才能对数据库进行操作,这样可以防止脏读,但是不能防止不可重复读和幻读;
Repeatable-read:可重复读
默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
Serializable:序列化
该模式是消耗最高最安全(代价最高最可靠)的隔离级别。可以防止脏读,不可重复读,和幻读。

十一、说一下 MySQL 常用的引擎?

innodb:
InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
MyISAM:
MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyISAM 引擎会保存表的行数,于是当进行 select count(
) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作,并且不需要事务的支持的情况下,可以将 MyISAM 作为数据库引擎的首选。

十二、说一下 MySQL 的行锁和表锁?

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁的粒度大,发生锁冲突的概率最高,并发量最低。
行级锁:开销大,加锁慢,会出现死锁。锁的粒度小,发生锁冲突的概率小,并发度最高。

十三、说一下乐观锁和悲观锁?

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。

十四、MySQL 问题排查都有哪些手段?

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

十五、如何做 MySQL 的性能优化?

1、为搜索字段创建索引。
2、避免使用 select *,列出需要查询的字段。
3、垂直分割分表。
4、选择正确的存储引擎。

十六、Mysql的索引结构、B+tree和BTree的区别?

1、在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
2、B+Tree为所有叶子节点增加了一个链指针。

十七、为什么用B/B+树这种结构来实现索引呢?

mysql是基于磁盘的数据库,索引是以索引文件的形式存在于磁盘中的,索引的查找过程就会涉及到磁盘IO消耗,磁盘IO的消耗相比较于内存IO的消耗要高好几个数量级,所以索引的组织结构要设计得在查找关键字时要尽量减少磁盘IO的次数,而只有B/B+树这种数据结构才能满足需要。

十八、为什么mysql的索引使用B+树而不是B树呢?

1、B+树更适合外部存储(一般指磁盘存储),由于内节点(非叶子节点)不存储data,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更精确。也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高。
2、mysql是关系型数据库,经常会按照区间来访问某个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间访问性,所以B+树对索引列上的区间范围查询很友好。而B树每个节点的key和data在一起,无法进行区间查找。

猜你喜欢

转载自blog.csdn.net/qq_42697271/article/details/114012692