Java面试经验总结之MySQL
1.mysql事务的四大特性?
答:MySQL事务主要有4大特性,分别是原子性、一致性、隔离性、持久性。其中原子性确保事务中的所有操作要么全部完成,要么全部不完成;一致性是指数据库从一个一致性的状态转换到另外一个一致性的状态;隔离性确保并发执行的事务彼此隔离开来,避免相互干扰;持久性确保事务一旦提交,其结果是永久性的。以上。
2.Mysql的事务隔离级别?
答:MySQL 主要支持四种事务隔离级别,分别是读未提交、读已提交、可重复读和串行化。
读未提交的意思是一个事务可以读取另一个未提交事务的数据,可能导致脏读,即一个事务读取了另一个事务未提交的数据。如果该事务回滚,那么读到的数据将是无效的。
读已提交是说一个事务只能读取已经提交的事务的数据。这样可以避免脏读,但可能会出现不可重复读,即A事务读取完数据后B事务提交数据,A事务再次读取的数据和上次不相同。
可重复读是说一个事务在整个过程中多次读取同一行数据时,结果是相同的。可以避免脏读和不可重复读,但可能会出现幻读。
串行化,这种级别下,事务完全串行化执行,避免了脏读、不可重复读和幻读。代价是并发性大大降低,事务可能会因为锁等待而阻塞。
3.Mysql脏读、幻读、不可重复读如何解释?
脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。例如:张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。
不可重复读
是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。例如:在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。与此同时,事务B把张三的工资改为8000,并提交了事务。随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。
幻读
是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如:目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。
不可重复读和幻读有什么区别
不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增或者删除:同样的条件,第 1 次和第 2 次读出来的记录数不一样。
4.Mysql存储引擎MyISAM与InnoDB区别?
事务支持:MyISAM 不支持事务,无法进行回滚和提交操作;InnoDB 支持事务,提供 ACID 特性(原子性、一致性、隔离性、持久性)。
2锁机制:MyISAM 使用表级锁,每次操作都会锁定整个表,适合读多写少的应用;InnoDB 使用行级锁,每次操作只锁定相关的行,适合高并发和写操作频繁的应用。
3外键支持:MyISAM 不支持外键,无法在表间建立引用完整性约束;InnoDB 支持外键,可以在表间建立引用完整性约束,保证数据的一致性和完整性。
4全文索引:MyISAM 原生支持全文索引,适合需要全文搜索的应用;InnoDB 从 MySQL 5.6 开始支持全文索引,但性能和功能上仍不如 MyISAM。
5数据存储结构:MyISAM 将数据存储在三个文件中(.frm文件存储表结构,.MYD文件存储数据,.MYI文件存储索引);InnoDB 将数据和索引存储在表空间文件中,支持自动扩展和多表空间。
6崩溃恢复:MyISAM 只支持基于表的崩溃恢复,恢复过程较慢且不完全;InnoDB 支持自动崩溃恢复,通过重做日志和回滚日志实现快速和完整的恢复。
7性能:MyISAM 在读多写少场景下性能优越,查询速度快,占用资源少;InnoDB 在高并发和事务密集型场景下性能优越,写操作和并发处理能力强。
8存储空间:MyISAM 存储空间效率较高,数据文件较小;InnoDB 可能占用更多存储空间,特别是需要存储事务日志和外键约束信息。
9表的大小限制:MyISAM 受文件系统限制,单个表最大可达 256TB(取决于文件系统);InnoDB 最大表大小可达 64TB,适合处理大规模数据集。
10适用场景:MyISAM 适用于读多写少的场景,如数据仓库、日志分析等;InnoDB 适用于事务密集型和高并发场景,如在线交易系统、社交网络等。
5.数据库的三范式是什么?
答:
第一范式(确保每列保持原子性):表中的字段不可再次拆分。比如地址,如果频繁的访问地址的省市。我们将地址进行拆分存储即可。这样才满足第一范式。
第二范式(确保表中每列都和主键相关):如果说我们有一个用户表和一个权限表。如果说我们用用户的id和角色的id作为主键,也是可以进行存储的。这样的问题就是,其中的任意一个信息,并不是和主键完全相关的。如果将用户id和角色id分别拆分为两个表。然后用一个中间表关联,这样是符合第二范式的。
第三范式(确保每列都和主键列直接相关,而不是间接相关):第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
6.mysql索引存储结构?
在 MySQL 中,索引的存储结构主要有两种:B+树索引和哈希索引。不同的存储引擎使用不同的索引结构。以下是对这两种索引结构的详细说明:
1. B+树索引
B+树索引是 MySQL 中最常用的索引结构,尤其是 InnoDB 存储引擎使用 B+树作为其默认的索引结构。B+树是一种平衡树结构,所有实际的数据都存储在叶子节点上,并且叶子节点通过链表连接。B+树索引适用于大多数查询场景,包括范围查询。
2. 哈希索引
哈希索引是一种基于哈希表的数据结构,通过哈希函数将键值映射到哈希表中的桶(bucket)位置。哈希索引适用于等值查询,但不适用于范围查询。MySQL 的 Memory 存储引擎支持哈希索引。
7.InnoDB 的聚簇索引和辅助索引
聚簇索引(Clustered Index)
- 定义:聚簇索引是按照主键顺序存储数据行的索引。
- 特点:数据行和主键值存储在一起,叶子节点包含了完整的数据行。
- 优点:查询效率高,尤其是范围查询。
辅助索引(Secondary Index)
- 定义:辅助索引是非主键列上的索引。
- 特点:叶子节点存储的是主键值,而不是数据行本身。
- 优点:支持快速查找非主键列,但查询时需要进行一次回表操作(通过主键值查找完整的数据行)。