MySQL面试问答

1.什么是MySQL

关系型数据库 存储数据的 直接存储到硬盘!与之对应的NoSQL非关系型数据库,代表(Redis)

2.MyISAMInnoDB区别

两个只是5.5版本前后的默认数据库引擎 对比区别如下:

a.是否支持行级锁(针对表中某一行数据进行锁定,防止其他事务修改或者删除数据,精细度高从而并发处理效率高):MyISAM(表级锁)InnoDB(行级锁和表级锁,默认为行级锁)

b.是否支持事务和崩溃后的安全恢复:MyISAM强调的是性能,每次查询操作都具有原子性,但是不支持事务,InnoDB提供事务支持事务,外部键等功能 

c.是否支持外键(一个表中用来关联另一个表的字段或属性:MyISAM(不支持)InnoDB(支持)

d.是否支持MVCC(并发控制机制):仅InnoDB支持

3.什么是索引?常用索引是什么? 

以下一个简单的示例,介绍数据库中如何创建索引

扫描二维码关注公众号,回复: 15229079 查看本文章

常用索引使用的数据结构分类:

a.BTree索引:

Mysql的BTree索引主要是使用B树中的B+树;但是对于5.5版本前后不同的引擎存储方式却不一样;

MyISAM:B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,⾸先按照 B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的值为地址读取相应的数据记录

InnoDB:其数据文件本身就是索引文件。相比MyISAM,索引文件和数数据件是分离的,其表数据文件本身就是按B+Tree组织的⼀个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方

        在根据主索引搜索时,直接找到key 在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走⼀遍主索 引。 因此,在设计表的时候,不建议使⽤过⻓的字段作为主键,也不建议使用非单调的字段 作为主键,这样会造成主索引频繁分裂

b.哈希索引:

哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余⼤部分场景,建议选择BTree 索引;
并发事务带来哪些问题?
1.脏读:
当一个事务正在访问数据的时候并且对数据进行了修改,而这种修改此时还没有提交到数据库当中,这时如果其他事务也访问到了这个数据,然后使用了数据,因为这个数据是还没有提交的数据,那么我们认为其他事务读取到的这个数据是“脏了的”后面的操作自然也是不正确的
2.丢失修改:
指的是一个事务在读取一个数据的时候,其他事务也访问了该数据,那么如果第一个事务修改了此数据,而其他事务修改这个数据的话,那么前几次修改结果就会丢失,这就是 “丢失修改”
3.不可重复读:
指的是一个事务多次读取同一数据,在这个事务还没有结束的时候,其他事务也访问这个数据,那么在第一个事务两次读数据期间,由于第二个事务的修改可能导致第一个事务两次访问读取到的数据不一样,这就是造成了 “不可重复读”
4.幻读:
指的是一个事务读取了几行数据,接着其他事务读取此数据并且进行考虑修改和插入,在之后的过程中就会发现一些原本不存在的记录,就好像发生了幻觉一样!称为“ 幻读
事务的隔离级别有哪些?MySQL的默认隔离级别是什么?
1.读取已提交(没啥用 用的少):
最低的隔离级别,允许读取尚未提交的数据变更, 可能会导致脏读、幻读或不可重复读
2.读取未提交(默认级别):
  允许读取并发事务已经提交的数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣ 
3.可重复读:
对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本身事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣
4.可串行化:
最⾼的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可重复读以及幻读;( 串行化隔离级别下所有的读操作都会获取共享锁,因此可能会导致性能下降。因此,在实际应用中需要根据具体情况选择合适的隔离级别
锁机制与InnoDB锁算法
在数据库当中,锁机制用于控制并发访问数据的方式,来保证事务的正确性和一致性!所以采用多种锁算法来实现锁机制;
InnoDB锁算法主要分为两类:共享锁与排他锁
共享锁:允许多个事务同时读取同一个数据,但是不允许写操作
排他锁:只允许一个失去进行读写操作,其他事务不能进行任何操作
InnoDB采用了两段式锁定协议,在执行事务期间会自动为相关的数据加上适当的共享锁或排他锁,下面是实现的三种锁算法:
a.行级锁,对其中的某一行加上共享锁或排他锁,从而保证事务之间的隔离性
b.间隙锁,
c.插入意向锁,

假设有一个银行的账户系统,多个用户可以同时进行账户查询、转账和存款操作,以下是针对该场景下行级锁、间隙锁和插入意向锁的比喻:

  • 行级锁:就像每个账户都放在一个独立的柜子里,每个用户只能锁定自己需要操作的某个柜子,其他用户不能对它进行修改或删除操作,直到该用户完成操作并释放出柜子为止。

  • 间隙锁:就像每个账户之间都有一个空缺的柜子,如果一个用户锁定了某个账户的柜子,其他用户就无法锁定该账户前面或后面的空缺柜子,即使这些柜子里并没有实际的账户。同理,在间隙锁中,如果一个事务将某个范围内的数据行锁定,那么其他事务就无法在该范围内插入新的数据行,即使这些数据行实际上不存在。在银行账户系统的场景中,这意味着如果一个用户正在对某个账户进行转账或存款操作,其他用户就无法在该账户前面或后面插入任何操作,即使他们想要查询该账户的信息。

  • 插入意向锁:就像一个银行在处理转账请求时记录下了事务的意向,表示该事务可能会在某个分支上对账户进行修改操作。其他事务可以继续读取和修改已有数据,但是不能在该账户前面或后面插入新的操作,在该事务提交或回滚之前,意向锁会一直存在。这种锁可以用于避免死锁的问题,因为它可以帮助事务协调好对数据的访问序列。在银行账户系统的场景中,如果一个用户打算对某个账户进行存款或转账操作,它会请求一个插入意向锁,表示它将要对该账户进行修改操作。其他用户可以继续进行查询和操作,但是不能在该账户前面或后面插入任何操作,直到该用户完成操作并释放出意向锁为止。

大表优化
1.首先无非就是限定数据的范围查询
2.然后进行数据库的读写分离 主库负责写 从库负责读
3.垂直分区 根据一张表列的拆分 把一张列比较多的表拆分为多张表
4.水平分区 保持数据表结构不变,通过一些策略来存储数据分片,这样每一片数据分散到不同的表或者库中,从而达到了分布式的目的;水平分区可以支撑非常大的数据量
分库分表之后,id主键是如何处理的?
1.因为进行拆分成多个表以后,每个表都是从1开始累加,这样会出现一些问题,所以需要一个全局唯一的id来支持
2.id主键的处理方法一般如下:a.数据库自增id;b.利用redis生成id
一条SQL语句在MySQL中是如何执行的
1.词法分析器:将SQL字符串拆分为单个的令牌(tokens)如关键字,表名,列名等
2.语法分析器:根据语法规则检查SQL字符串是否符合语法结构,并生成一个解析树
3.优化器:对查询进行优化,选择最佳的执行计划,优化器会考虑多种优化策略(索引的使用,表连接顺序,where条件重写等)
4.执行器:按照优化器生成的执行计划执行查询语句,执行器会每一行读取与查询匹配的数据,并对结果进行处理和返回
5.返回结果集:执行器将结果集返回给客户端

猜你喜欢

转载自blog.csdn.net/weixin_64625868/article/details/130997585
今日推荐