1. 请介绍一下 MySQL 常见的存储引擎(如 InnoDB、MyISAM),它们的特点分别是什么?在什么场景下适合使用 InnoDB,什么场景下适合使用 MyISAM?
- InnoDB:
特点:支持事务,具有 ACID 特性;支持外键约束;采用行级锁,并发性能较好;有崩溃恢复能力;支持聚簇索引。
适用场景:适用于对数据完整性和并发要求较高的场景,如在线事务处理(OLTP)系统,像电商系统中的订单、库存管理等。 - MyISAM:
特点:不支持事务和外键;采用表级锁,并发性能较差;不支持崩溃恢复;索引和数据是分开存储的。
适用场景:适用于对读性能要求较高,对事务要求不高的场景,如数据仓库、日志记录等。
2. 在 MySQL 中,事务的四大特性(ACID)分别是什么?如何在 Java 代码中使用 JDBC 来管理 MySQL 事务?请举例说明。
ACID 特性:
- 原子性(Atomicity):事务是一个不可分割的操作序列,要么全部执行成功,要么全部失败回滚。
- 一致性(Consistency):事务执行前后,数据库的状态保持一致。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应该影响其他事务的执行。
- 持久性(Durability):事务一旦提交,其对数据库的改变是永久的。
3. 索引的作用和原理
- 作用:索引可以提高数据库的查询效率,减少数据库的 IO 操作。
- 原理:索引是一种数据结构,它将表中的某些列的值进行排序,并建立一个映射关系,通过这个映射关系可以快速定位到数据所在的位置。
4. 常见索引类型
- B 树索引:是一种平衡的多路搜索树,适用于范围查询和排序操作。
- 哈希索引:通过哈希函数将索引列的值映射到一个哈希表中,适用于等值查询。
5. 索引不是越多越好
不是;索引会占用额外的存储空间,并且在插入、更新和删除数据时,需要维护索引,会影响数据库的写入性能
6. 优化索引的使用
- 只对经常用于查询条件、排序和连接的列创建索引。
- 避免在低选择性的列上创建索引。
- 定期对索引进行优化和重建。
7. 当你发现 MySQL 数据库的查询性能较差时,你会从哪些方面进行优化?请举例说明。
- 索引优化:对经常用于查询条件、排序和连接的列创建索引。例如,如果经常根据 user_id 进行查询,可以在 user_id 列上创建索引。
- SQL 语句优化:避免使用子查询,尽量使用 JOIN 代替;避免使用 SELECT *,只选择需要的列。
- 数据库配置优化:调整数据库的参数,如 innodb_buffer_pool_size 等。
- 表结构优化:合理设计表结构,避免数据冗余。
8. 主从复制的原理和作用
- 原理:主从复制是指将主数据库的变更记录到二进制日志(binlog)中,从数据库通过 I/O 线程读取主数据库的 binlog,并将其应用到自己的数据库中。
- 作用:提高数据库的可用性和读写性能,实现数据的备份和灾难恢复。
9. Java 应用实现读写分离的思路和步骤
思路:将读操作指向从数据库,将写操作指向主数据库。
步骤:
配置主从数据库,确保主从复制正常工作。
在 Java 应用中,使用多个数据源分别连接主数据库和从数据库。
根据 SQL 语句的类型(读或写)选择不同的数据源。可以通过 AOP 或自定义注解来实现。
10.MySQL 中有哪些常见的锁类型(如共享锁、排他锁、行锁、表锁等)?它们的区别是什么?
- 共享锁(Shared Lock):多个事务可以同时对同一资源加共享锁,共享锁之间是兼容的,但共享锁与排他锁不兼容。
- 排他锁(Exclusive Lock):一个事务对资源加排他锁后,其他事务不能再对该资源加任何类型的锁。
- 行锁(Row Lock):锁定表中的某一行数据,并发性能较好。
- 表锁(Table Lock):锁定整个表,并发性能较差。