在面试中,关于 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 支持以下四种事务隔离级别:
- READ UNCOMMITTED:允许读取未提交的事务的数据,可能会出现脏读。
- READ COMMITTED:只允许读取已提交事务的数据,避免脏读,但可能会有不可重复读。
- REPEATABLE READ:保证一个事务中的数据读操作是可重复的,避免脏读和不可重复读,但可能会出现幻读。
- 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 及其高级特性。