在日常的后端开发中,MySQL 作为一款经典的关系型数据库,是我们数据存储和管理的核心工具。想要让 MySQL 发挥出最优性能,同时保证数据的完整性、一致性和安全性,就必须深入掌握索引、数据库设计、事务和视图这些核心知识点。本文将结合实战场景,详细拆解这四大核心模块的使用逻辑与最佳实践。
一、索引:提升查询效率的'加速器'
索引是 MySQL 优化查询性能的关键手段,其本质是一种特殊的数据结构(如 B+ 树),能够帮助数据库快速定位到目标数据,避免全表扫描带来的性能损耗。
本文详解 MySQL 四大核心模块:索引通过 B+ 树加速查询,需权衡创建场景;数据库设计遵循三大范式兼顾性能与冗余;事务利用 ACID 特性保障数据一致性,涉及隔离级别设置;视图作为虚拟表简化复杂查询并隐藏敏感数据。结合实际业务灵活运用这些知识点可提升数据库性能与安全性。

在日常的后端开发中,MySQL 作为一款经典的关系型数据库,是我们数据存储和管理的核心工具。想要让 MySQL 发挥出最优性能,同时保证数据的完整性、一致性和安全性,就必须深入掌握索引、数据库设计、事务和视图这些核心知识点。本文将结合实战场景,详细拆解这四大核心模块的使用逻辑与最佳实践。
索引是 MySQL 优化查询性能的关键手段,其本质是一种特殊的数据结构(如 B+ 树),能够帮助数据库快速定位到目标数据,避免全表扫描带来的性能损耗。
最基础的索引类型,无唯一性约束,仅用于加速查询。
-- 直接创建
CREATE INDEX idx_username ON user (username);
-- 修改表结构添加
ALTER TABLE user ADD INDEX idx_username (username);
-- 创建表时指定
CREATE TABLE user (
id INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX idx_username (username)
);
DROP INDEX idx_username ON user;
索引列的值必须唯一(允许 NULL 值),适用于需要保证字段唯一性的场景(如手机号、邮箱)。
-- 创建唯一索引
CREATE UNIQUE INDEX idx_phone ON user (phone);
-- 修改表结构添加
ALTER TABLE user ADD UNIQUE idx_phone (phone);
特殊的唯一索引,默认非空,是表中记录的唯一标识,一张表只能有一个主键索引。
-- 创建表时指定主键
CREATE TABLE user (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(16) NOT NULL
);
-- 修改表添加主键
ALTER TABLE user MODIFY id INT NOT NULL;
ALTER TABLE user ADD PRIMARY KEY (id);
-- 删除主键
ALTER TABLE user DROP PRIMARY KEY;
数据库设计的核心目标是保证数据的完整性和减少冗余,同时兼顾查询性能。业界主流的设计规范是'三大范式',但实际开发中需灵活调整,避免过度设计。
每一列的值必须是不可拆分的原子值。例如'地址'字段,若业务需要按'省份、城市、详细地址'查询,就不能直接存为'安徽省合肥市庐阳区 XX 路',而应拆分为 province、city、detail_address 三个字段。
在第一范式基础上,确保表中的每一列都和主键完全相关,而非仅和主键的一部分相关(针对联合主键)。例如订单表,若以'订单编号 + 商品编号'为联合主键,就不能在订单表中存储'商品名称、商品单价'(这些仅和商品编号相关),应拆分出商品表,通过外键关联。
在第二范式基础上,确保每一列都和主键直接相关,而非间接相关。例如订单表中,只需存储'用户 ID'(关联用户表),而非直接存储'用户名、用户手机号'(这些属于用户表的属性)。
实际业务中,表与表的关系主要分为三种:
严格遵循第三范式会减少数据冗余,但可能导致多表关联查询,降低性能。实际开发中可适当'反范式':例如在订单表中冗余'用户名',避免每次查询都关联用户表,以空间换时间。
事务是一组不可分割的数据库操作,要么全部成功,要么全部失败,是保证数据一致性的核心机制,尤其适用于转账、下单等关键业务场景。
MySQL 默认自动提交事务(一条 DML 语句即一个事务),可手动控制事务:
-- 创建账户表
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(10),
balance DOUBLE
);
INSERT INTO account(name, balance) VALUES ('张三', 1000), ('李四', 1000);
-- 开启事务
START TRANSACTION;
-- 张三给李四转账 500 元
UPDATE account SET balance = balance - 500 WHERE name = '张三';
UPDATE account SET balance = balance + 500 WHERE name = '李四';
-- 无异常则提交事务
COMMIT;
-- 有异常则回滚
-- ROLLBACK;
多个事务并发操作时,可能出现脏读、不可重复读、幻读等问题,可通过设置隔离级别解决:
查看/设置隔离级别:
-- 查看隔离级别
SELECT @@tx_isolation;
-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
视图是基于 SQL 查询结果的虚拟表,不存储实际数据,仅保存查询逻辑,可简化复杂查询、隐藏敏感数据,提升数据访问的安全性和便捷性。
-- 创建视图:查询员工姓名、部门名称(关联员工表和部门表)
CREATE VIEW v_emp_dept AS
SELECT emp.name, dept.name AS dept_name
FROM emp JOIN dept ON emp.dept_id = dept.id;
-- 查询视图(和查询普通表一致)
SELECT * FROM v_emp_dept;
-- 修改视图
ALTER VIEW v_emp_dept AS
SELECT emp.name, emp.salary, dept.name AS dept_name
FROM emp JOIN dept ON emp.dept_id = dept.id;
-- 删除视图
DROP VIEW v_emp_dept;
视图并非万能,以下场景视图不可更新(INSERT/UPDATE/DELETE):
实际开发中,视图主要用于查询,不建议通过视图修改数据。
MySQL 的索引、数据库设计、事务和视图是相辅相成的核心知识点:
在实际开发中,需结合业务场景灵活运用这些知识点,既保证数据的完整性和安全性,又能让数据库发挥出最优性能。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online