MYSQL面试题汇总(建以Mark!!)

1. 什么是MySQL?它与其他数据库(如Oracle、PostgreSQL)有何不同?

答案
MySQL 是一个开源的关系型数据库管理系统(RDBMS),使用SQL管理数据,广泛用于Web应用,因其性能高、易用和可扩展性强而受欢迎。

  • 与Oracle对比:MySQL开源免费,适合中小型应用;Oracle是商业数据库,功能强大,适合大型企业系统。
  • 与PostgreSQL对比:PostgreSQL支持复杂数据类型(如JSON、数组)和高级查询,MySQL更简单,适合读密集型场景。

2. MySQL有哪些存储引擎?它们的应用场景是什么?

答案
MySQL支持多种存储引擎:

  • InnoDB:默认引擎,支持事务、行级锁、外键,适合需要ACID的场景(如电商)。
  • MyISAM:支持表级锁,读性能高,适合读多写少的场景(如日志分析)。
  • Memory:数据存储在内存中,速度快但不持久,适合临时表或缓存。
  • Archive:压缩存储,适合归档和日志数据。
  • CSV:以CSV格式存储,适合数据导入/导出。

示例:电商用InnoDB保证事务一致性,分析系统用MyISAM提升查询速度。


3. 主键和外键的区别是什么?

答案

  • 主键:表中唯一标识每行记录的字段,不允许重复或NULL,每表只能有一个主键。
  • 外键:一个表中引用另一表主键或唯一键的字段,用于建立和强化表间关系,确保参照完整性。

示例
users表的user_id为主键,orders表的user_id为外键,引用users.user_id。


4. 什么是ACID?MySQL如何实现?

答案
ACID是数据库事务的四个特性:

  • 原子性(Atomicity):事务操作要么全部成功,要么全部回滚。
  • 一致性(Consistency):事务前后数据库状态保持一致。
  • 隔离性(Isolation):事务间互不干扰,MySQL通过隔离级别(如Read Committed)实现。
  • 持久性(Durability):事务提交后,数据永久保存。
    InnoDB通过日志(如redo log)和锁机制实现ACID。

5. MySQL的JOIN有哪些类型?请举例说明。

答案
MySQL支持以下JOIN类型:

  • INNER JOIN:返回两表匹配的记录。
  • LEFT JOIN:返回左表所有记录,右表匹配的记录(无匹配为NULL)。
  • RIGHT JOIN:返回右表所有记录,左表匹配的记录(无匹配为NULL)。
  • FULL JOIN:返回两表所有记录(MySQL不支持,可用UNION模拟)。

示例

SELECT users.name, orders.order_id
FROM users
LEFT JOIN orders ON users.user_id = orders.user_id;

6. CHAR和VARCHAR的区别是什么?

答案

  • CHAR:固定长度字符串,存储空间固定,适合存储长度一致的数据(如身份证号)。
  • VARCHAR:可变长度字符串,存储实际数据长度+1字节(长度标记),适合长度变化大的数据(如用户名)。
    示例:CHAR(10)总是占10字节,VARCHAR(10)存储"abc"只占4字节(3字节数据+1字节长度)。

7. 什么是索引?它的优缺点是什么?

答案
索引是提高查询性能的数据结构(如B+树),通过减少扫描的数据量加速查询。

  • 优点:加快SELECT查询和WHERE过滤,优化排序和分组操作。
  • 缺点:占用存储空间,插入/更新/删除操作变慢(需维护索引)。
    示例:为users.email创建索引:
CREATE INDEX idx_email ON users(email);

8. 索引的类型有哪些?

答案
MySQL支持以下索引类型:

  • 主键索引:唯一且非空,自动创建于主键列。
  • 唯一索引:确保列值唯一,允许NULL。
  • 普通索引:提高查询速度,无唯一性约束。
  • 全文索引:用于全文搜索(如LIKE查询),常用于MyISAM。
  • 复合索引:基于多个列的索引,适合多条件查询。
    示例
CREATE UNIQUE INDEX idx_name_email ON users(name, email);

9. 什么是事务?MySQL如何支持事务?

答案
事务是一组原子操作,要么全成功,要么全失败。
MySQL通过InnoDB支持事务,使用以下命令:

  • START TRANSACTION:开始事务。
  • COMMIT:提交事务。
  • ROLLBACK:回滚事务。
    示例
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;

10. MySQL的事务隔离级别有哪些?如何设置?

答案
MySQL支持四种隔离级别(InnoDB默认Repeatable Read):

  • Read Uncommitted:可能出现脏读。
  • Read Committed:解决脏读,可能出现不可重复读。
  • Repeatable Read:解决不可重复读,可能出现幻读。
  • Serializable:最高隔离级别,解决所有并发问题,但性能最低。
    设置方法
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

11. 什么是死锁?如何避免?

答案
死锁是多个事务相互等待对方释放资源,导致无法继续执行。
避免方法

  • 按固定顺序访问表和行。
  • 缩短事务时间,减少锁持有时间。
  • 使用较低的隔离级别(如Read Committed)。
  • 监控死锁:SHOW ENGINE INNODB STATUS;。
    示例:事务1更新表A后表B,事务2相反,可能死锁;统一访问顺序可避免。

12. 什么是触发器?如何创建?

Answer
触发器是与表关联的特殊存储过程,在特定事件(如INSERT、UPDATE、DELETE)时自动执行。
创建示例

CREATE TRIGGER after_user_insert
AFTER INSERT ON users
FOR EACH ROW
INSERT INTO logs (user_id, action) VALUES (NEW.user_id, 'INSERT');

13. 什么是视图?它的用途是什么?

答案
视图是基于查询的虚拟表,存储查询逻辑,不存储数据。
用途

  • 简化复杂查询。
  • 提供数据访问控制(只暴露部分列)。
  • 提高查询可读性。
    示例
CREATE VIEW user_orders AS
SELECT users.name, orders.order_id
FROM users JOIN orders ON users.user_id = orders.user_id;

14. EXPLAIN命令的作用是什么?

答案
EXPLAIN分析查询执行计划,显示MySQL如何执行查询,包括使用的索引、扫描行数等。
示例

EXPLAIN SELECT * FROM users WHERE email = '[email protected]';

输出包括type(访问类型,如ref)、key(使用的索引)等。


15. 什么是慢查询?如何优化?

答案
慢查询是执行时间超过阈值的查询(由long_query_time定义)。
优化方法

  • 检查EXPLAIN分析查询计划,优化索引。
  • 避免全表扫描,添加合适索引。
  • 简化复杂查询,拆分多表JOIN。
  • 启用慢查询日志:set global slow_query_log = 1;。

16. MySQL中如何实现分页查询?

答案
使用LIMIT和OFFSET实现分页。
示例:显示第2页,每页10条记录:

SELECT * FROM users ORDER BY user_id LIMIT 10 OFFSET 10;

注意:大偏移量可能导致性能下降,可用主键过滤优化。


17. 什么是存储过程?如何创建?

答案
存储过程是一组预编译的SQL语句,存储在数据库中,可重复调用。
优点:减少网络传输,提高性能,封装逻辑。
示例

DELIMITER //
CREATE PROCEDURE GetUser(IN uid INT)
BEGIN
    SELECT * FROM users WHERE user_id = uid;
END //
DELIMITER ;
CALL GetUser(1);

18. 表分区和分表的区别是什么?

答案

  • 表分区:将一个表的数据按规则(如范围、哈希)分成多个逻辑分区,物理上仍是一个表,适合大表管理。
  • 分表:将数据分散到多个独立表(如按年份分表),逻辑和物理上分离,需应用层处理。
    示例:分区按年份:
CREATE TABLE orders (
    order_id INT,
    order_date DATE
) PARTITION BY RANGE (YEAR(order_date)) (
    PARTITION p0 VALUES LESS THAN (2023),
    PARTITION p1 VALUES LESS THAN (2024)
);

19. 如何备份和恢复MySQL数据库?

答案

  • 备份:使用mysqldump导出数据库。
    mysqldump -u root -p mydb > backup.sql
  • 恢复:使用mysql命令导入。
    mysql -u root -p mydb < backup.sql

注意:定期备份,验证备份文件完整性。


20. MySQL如何优化大表查询性能?

答案

  • 索引优化:为WHERE、JOIN、ORDER BY列创建索引。
  • 分区表:按时间或范围分区,减少扫描数据。
  • 查询优化:避免SELECT *,减少不必要列;使用EXPLAIN分析。
  • 缓存:启用查询缓存(MySQL 8.0前)或外部缓存(如Redis)。
  • 分表:将大表拆分为小表。
    示例:为频繁查询的列添加索引:
CREATE INDEX idx_date ON orders(order_date);

你可能感兴趣的:(MYSQL面试题汇总(建以Mark!!))