首页 / 资讯中心 / 文章详情

MySQL性能优化全攻略:从索引到事务之13812字详解(一)

MySQL性能优化全攻略:从索引到事务之13812字详解(一) ★ FEATURED ARTICLE
本文汇总了 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:缓存数据和索引,减少磁盘IOMyISAM适用场景:只读或读多写少的场景(如数据仓库)需要全文检
阅读完成 · 觉得有帮助?
咨询建站