☰
MySQL性能优化全攻略:从索引到事务之13812字详解(一)
2026/9/28 4:57:01 网站建设 项目流程

本文汇总了 MySQL 面试中的高频知识点,覆盖增删查改(CRUD)、索引、事务、存储引擎、日志、隔离级别、主从复制、备份恢复、数据迁移以及高可用架构等核心主题,并结合实际运维场景给出可落地的命令与方案。无论你是正在准备后端开发面试的工程师,还是希望夯实基础、提升排障能力的初级 DBA,都可以把本文作为一份系统性的复习提纲,按章节逐项对照自查,查漏补缺。

1、查看当前库和表的命令

查看当前数据库:

SELECT DATABASE(); -- 查看当前所在库 SHOW DATABASES; -- 查看所有数据库 USE database_name; -- 切换数据库

查看当前表:

SHOW TABLES; -- 查看当前库所有表 SHOW TABLES FROM db_name; -- 查看指定库的所有表 DESC table_name; -- 查看表结构 SHOW CREATE TABLE table_name; -- 查看建表语句 SHOW TABLE STATUS; -- 查看表状态信息(引擎、行数等)

2、MySQL的增删查改命令(CRUD)

增(INSERT):

-- 插入单条 INSERT INTO users (name, age) VALUES ('张三', 20); -- 插入多条 INSERT INTO users (name, age) VALUES ('李四', 25), ('王五', 30); -- 插入查询结果 INSERT INTO users_backup SELECT * FROM users WHERE age > 18;

删(DELETE/TRUNCATE):

-- 条件删除(可回滚,记录日志) DELETE FROM users WHERE id = 1; -- 清空表(快速,不可回滚,不记录单行日志) TRUNCATE TABLE users; -- 删除表结构 DROP TABLE users;

查(SELECT):

-- 基础查询 SELECT * FROM users WHERE age > 20 ORDER BY id DESC LIMIT 10; -- 聚合查询 SELECT dept_id, AVG(salary) as avg_sal FROM employees GROUP BY dept_id HAVING avg_sal > 5000; -- 联表查询 SELECT u.name, o.order_no FROM users u LEFT JOIN orders o ON u.id = o.user_id;

改(更新):

-- 单表更新 UPDATE users SET age = age + 1 WHERE id = 1; -- 多表关联更新 UPDATE users u JOIN orders o ON u.id = o.user_id SET u.last_order_time = o.create_time WHERE o.status = 'completed';

3、索引的作用是什么? 有哪些类型?

答:索引是帮助MySQL高效获取数据的数据结构,主要作用是加快查询速度,同时也会影响写入性能(需要维护索引树)。具体来说,索引相当于一本书的目录,通过建立索引,MySQL可以避免全表扫描,直接从索引结构中定位到目标数据所在的位置,从而大幅减少磁盘IO和CPU开销。在数据量较小(如几千行)时,全表扫描和索引查询的差距并不明显;但当表数据量达到百万级甚至更高时,索引带来的性能提升往往是数量级的。不过,索引并非越多越好:每次执行INSERT、UPDATE、DELETE操作时,MySQL都需要同步维护索引树,导致写入性能下降;同时索引本身也会占用额外的磁盘空间。因此,在实际设计中需要结合查询频率、写入压力和存储成本,合理选择需要建立索引的列,避免为不常用的列盲目添加索引。

索引类型详解:

类型说明适用场景
主键索引唯一非空,每张表只有一个主键列
唯一索引列值必须唯一,允许NULL手机号、邮箱等唯一字段
普通索引无唯一性约束频繁查询的非唯一字段
组合索引多列联合索引,遵循最左前缀原则多条件查询(其中 a=1 且 b=2)
全文索引针对文本内容的分词索引大文本搜索(MyISAM支持更好)
覆盖索引查询字段都在索引中,无需回表高频查询优化

索引数据结构:

  • B+树索引(InnoDB默认):支持范围查询,叶子节点存储数据
  • Hash索引:精确匹配快,不支持范围查询(Memory引擎支持)

索引失效场景:

  • 在索引列上使用函数或运算(WHERE YEAR(create_time) = 2024)
  • 前导模糊查询(LIKE '%abc')
  • 隐式类型转换(字符串列用数字查询)
  • 违反最左前缀原则(组合索引未用第一列)
  • 使用OR条件且部分列无索引

4、简述下MySQL中的事务

答:事务(Transaction)是数据库操作的基本逻辑单位,由一组SQL语句组成,保证这些操作要么全部成功提交,要么全部失败回滚,以此维护数据的完整性和一致性。

事务的生命周期:

START TRANSACTION; -- 或 BEGIN -- 执行SQL操作 UPDATE account SET balance = balance - 100 WHERE id = 1; UPDATE account SET balance = balance + 100 WHERE id = 2; -- 检查业务规则 IF (满足条件) THEN COMMIT; -- 提交,永久生效 ELSE ROLLBACK; -- 回滚,恢复原状 END IF;

事务的使用场景:

  • 银行转账(扣款+入账必须同时成功)
  • 订单创建(订单表+库存表+日志表同时更新)
  • 批量数据处理(保证数据一致性)

5、事务的ACID四大特性

答:ACID是事务的四个核心特性:

特性英文核心含义实现机制
原子性原子性事务是最小执行单位,不可再分,要么全成功要么全失败撤销日志(回滚日志)
一致性一致性事务执行前后,数据库从一个合法状态变为另一个合法状态约束检查+其他三大特性共同保证
隔离性隔离多个事务并发执行时,彼此互不干扰MVCC(多版本并发控制)+ 锁机制
持久性耐久性事务一旦提交,数据永久保存,即使系统故障Redo Log(重做日志)+ Binlog

详细解析:

  • 原子性:通过Undo Log实现,记录修改前的数据,用于失败时回滚
  • 隔离性:通过MVCC和锁实现,避免脏读、不可重复读、幻读
  • 持久性:通过Redo Log实现WAL(Write-Ahead Logging),先写日志再刷盘

6、InnoDB和MyISAM存储引擎的区别

答:

特性InnoDBMyISAM
事务支持✅ 支持ACID❌ 不支持
锁粒度行级锁(高并发)表级锁(并发低)
外键✅ 支持❌ 不支持
崩溃恢复✅ 支持(Redo Log)❌ 不支持
全文索引5.6+支持✅ 原生支持
存储空间较高(聚簇索引)较低(非聚簇索引)
适用场景高并发、事务型业务(OLTP)读密集型、日志分析(OLAP)

关键区别详解:

InnoDB核心优势:

  • 聚簇索引:数据按主键顺序存储,主键查询极快
  • MVCC:实现非阻塞读,提升并发性能
  • Buffer Pool:缓存数据和索引,减少磁盘IO

MyISAM适用场景:

  • 只读或读多写少的场景(如数据仓库)
  • 需要全文检

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询