资深面试之MySQL 问题及解答(一)
**在面试中,关于 MySQL 的高级问题通常涉及底层架构、数据一致性、存储引擎以及性能优化等方面。以下是一些常见的资深 MySQL 面试问题及解答,供您参考。**
---
### 1. **MySQL 中有哪几种锁?**
MySQL 中主要有两种锁:
- **共享锁(S锁,Shared Lock)**:允许事务读取数据,但不允许其他事务修改该数据。
- **排他锁(X锁,Exclusive Lock)**:允许事务修改数据,且在锁定期间,其他事务不能读取或修改该数据。
除此之外,还有以下几种锁的细分:
- **行级锁**:在 InnoDB 存储引擎中,锁定的是表中的某一行数据,允许多个事务并发操作不同的行。
- **表级锁**:锁定整个表,通常使用在 MyISAM 存储引擎中,不能并发操作。
- **意向锁**:主要用于行级锁,防止不同事务之间产生冲突。
---
### 2. **MySQL 中有哪些不同的表格?**
MySQL 中有两种主要的存储引擎,每种引擎使用不同的表格类型:
- **MyISAM**:默认存储引擎,支持表级锁,不支持事务和外键。
- **InnoDB**:支持行级锁,支持事务、外键、ACID 特性。
- **MEMORY**:数据存储在内存中,查询速度快,但重启时数据会丢失。
- **CSV**:表数据存储为 CSV 文件,适合导入/导出。
- **ARCHIVE**:适合存储大量归档数据,支持压缩。
---
### 3. **简述在 MySQL 数据库中 MyISAM 和 InnoDB 的区别**
| 特性 | MyISAM | InnoDB |
|--------------|----------------------------|-------------------------------|
| **锁机制** | 表级锁 | 行级锁 |
| **事务支持** | 不支持事务 | 支持事务 |
| **外键支持** | 不支持外键约束 | 支持外键约束 |
| **崩溃恢复** | 不支持崩溃恢复 | 支持崩溃恢复 |
| **存储格式** | 基于文件的存储格式,.MYD 和 .MYI | 基于表空间存储,支持多表空间 |
| **性能** | 适合只读查询或少量写操作的应用 | 适合复杂事务和高并发写操作的应用 |
---
### 4. **MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?**
InnoDB 支持以下四种事务隔离级别:
1. **READ UNCOMMITTED**:允许读取未提交的事务的数据,可能会出现脏读。
2. **READ COMMITTED**:只允许读取已提交事务的数据,避免脏读,但可能会有不可重复读。
3. **REPEATABLE READ**:保证一个事务中的数据读操作是可重复的,避免脏读和不可重复读,但可能会出现幻读。
4. **SERIALIZABLE**:完全隔离,强制事务按顺序执行,避免脏读、不可重复读和幻读,但性能最低。
---
### 5. **CHAR 和 VARCHAR 的区别?**
- **CHAR**:固定长度的字符串,存储时会根据定义长度填充空格。例如,`CHAR(10)` 总是存储 10 个字符。
- **VARCHAR**:可变长度的字符串,仅存储实际内容长度,占用空间更少。
---
### 6. **主键和候选键有什么区别?**
- **主键(Primary Key)**:唯一标识一条记录,并且不允许有空值(NULL)。
- **候选键(Candidate Key)**:是能唯一标识记录的字段,可以有多个候选键,但只有一个主键。
---
### 7. **myisamchk 是用来做什么的?**
`myisamchk` 是一个用于检查和修复 MyISAM 表的工具。当 MyISAM 表遭到损坏时,可以使用该命令来修复表格。
```bash
myisamchk -r table_name
```
---
### 8. **如果一个表有一列定义为 TIMESTAMP,将发生什么?**
- `TIMESTAMP` 类型的列自动存储当前时间戳。
- 默认情况下,`TIMESTAMP` 列会在每次插入或更新时自动更新时间戳。
---
### 9. **你怎么看到为表格定义的所有索引?**
可以使用 `SHOW INDEX` 命令查看表格定义的所有索引:
```sql
SHOW INDEX FROM table_name;
```
---
### 10. **LIKE 声明中的 % 是什么意思?**
在 `LIKE` 声明中,`%` 表示零个或多个字符。用 `%` 来匹配任意长度的字符。例如:
```sql
SELECT * FROM table WHERE name LIKE 'A%';
```
这将匹配所有以 "A" 开头的名字。
---
### 11. **列对比运算符是什么?**
列对比运算符用于比较两个列的值。常用的列对比运算符包括:
- `=`:等于
- `!=` 或 `<>`:不等于
- `<`、`>`:小于或大于
- `<=`、`>=`:小于等于或大于等于
- `BETWEEN`:范围查找
- `IN`:匹配多个值
---
### 12. **BLOB 和 TEXT 有什么区别?**
- **BLOB**:用于存储二进制数据,如图片、音频等。
- **TEXT**:用于存储文本数据,长度可以非常大,适合存储长文本。
---
### 13. **MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么?**
- `mysql_fetch_array`:返回一行数据,可以通过数字索引或字段名访问结果。
- `mysql_fetch_object`:返回一行数据,可以通过字段名访问结果,但不支持数字索引。
---
### 14. **MyISAM 表格将在哪里存储,并且还提供其存储格式?**
- MyISAM 表的存储位置通常在 MySQL 数据目录下。
- MyISAM 使用 `.MYD` 文件存储数据,`.MYI` 文件存储索引。
---
### 15. **如何显示前 50 行?**
可以使用 `LIMIT` 子句来限制返回的行数:
```sql
SELECT * FROM table_name LIMIT 50;
```
---
### 16. **可以使用多少列创建索引?**
在 InnoDB 存储引擎中,索引最多可以包含 16 列。
---
### 17. **NOW() 和 CURRENT_DATE() 有什么区别?**
- `NOW()` 返回当前的日期和时间。
- `CURRENT_DATE()` 仅返回当前的日期。
---
### 18. **什么是非标准字符串类型?**
非标准字符串类型通常指的是不符合 SQL 标准的字符串类型,例如 `TEXT` 或 `BLOB`,这些类型是为了满足特定的需求,如存储二进制数据或大文本。
---
### 19. **什么是通用 SQL 函数?**
通用 SQL 函数指的是可以在不同的数据库管理系统中通用的 SQL 函数,如 `COUNT()`, `AVG()`, `MAX()`, `MIN()` 等聚合函数。
---
### 20. **MySQL 支持事务吗?**
是的,MySQL 支持事务,特别是在使用 InnoDB 存储引擎时。事务支持 ACID 特性(原子性、一致性、隔离性和持久性)。
---
这些问题覆盖了 MySQL 的多方面知识,帮助您更深入理解 MySQL 及其高级特性。