极客时间mysql进阶训练营

MySQL进阶技巧详解

1. 索引与优化

索引作用 :

索引是数据库的"目录",通过构建数据结构(如B-Tree、Hash等)加速查询。合理使用索引可显著提升性能,但需注意索引的维护成本。

极客时间mysql进阶训练营

常见索引类型:

  • B-Tree(默认) :
    • 适用于范围查询(如WHERE age > 18)、排序和分组。
    • 示例:CREATE INDEX idx_age ON users(age);
  • FULLTEXT:
    • 用于全文搜索(如博客文章、商品描述)。
    • 示例:CREATE FULLTEXT INDEX idx_content ON articles(content);
  • HASH:
    • 适用于等值查询(如WHERE id = 123),但无法用于范围查询。
    • 示例:CREATE INDEX idx_hash ON users(id) USING HASH;

优化建议:

  • 覆盖索引:让查询仅访问索引,避免回表。
    • 示例:SELECT id, name FROM users WHERE age = 25;(索引包含age, id, name)
  • 避免冗余索引:定期清理无用索引,减少写入开销。
  • 分析查询计划 :使用EXPLAIN查看索引使用情况。

2. 视图、存储过程和函数

视图(View) :

  • 定义:虚拟表,封装复杂查询逻辑。

  • 用途:简化查询、权限控制(如只暴露部分字段)。

  • 示例:

    sql 复制代码
    sql
sql 复制代码
CREATE VIEW active_users AS
ini 复制代码
SELECT id, name FROM users WHERE status = 'active';
sql 复制代码
SELECT * FROM active_users;

存储过程(Stored Procedure) :

  • 定义:预编译的SQL代码块,可包含逻辑判断和事务。

  • 用途:提高代码复用性、减少网络传输。

  • 示例:

    sql 复制代码
    sql
arduino 复制代码
DELIMITER //
sql 复制代码
CREATE PROCEDURE GetUserById(IN userId INT)
sql 复制代码
BEGIN
ini 复制代码
SELECT * FROM users WHERE id = userId;
arduino 复制代码
END //
ini 复制代码
DELIMITER ;
scss 复制代码
CALL GetUserById(1);

函数(Function) :

  • 定义:返回单一值的存储过程,常用于计算。

  • 与存储过程的区别:函数可嵌套在SQL中,存储过程不可。

  • 示例:

    sql 复制代码
    sql
sql 复制代码
CREATE FUNCTION CalculateAge(birthdate DATE) RETURNS INT
sql 复制代码
BEGIN
scss 复制代码
RETURN TIMESTAMPDIFF(YEAR, birthdate, CURDATE());
ini 复制代码
END;
arduino 复制代码
SELECT CalculateAge('1990-01-01');

3. 事务与锁

事务(Transaction) :

  • ACID属性:

    • 原子性:事务要么全成功,要么全失败。
    • 一致性:事务前后数据保持一致。
    • 隔离性:事务间互不干扰(通过锁实现)。
    • 持久性:事务提交后数据永久保存。
  • 使用示例:

    sql 复制代码
    sql
ini 复制代码
START TRANSACTION;
ini 复制代码
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
ini 复制代码
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
sql 复制代码
COMMIT; -- 或 ROLLBACK;

锁机制:

  • 表级锁:
    • 锁定整个表,并发性低,但开销小。
    • 示例:LOCK TABLES users WRITE;
  • 行级锁:
    • 仅锁定目标行,并发性高,但开销大。
    • 示例:SELECT * FROM users WHERE id = 1 FOR UPDATE;
  • 隔离级别(影响锁的行为):
    • READ UNCOMMITTED:最低隔离,可能读到脏数据。
    • READ COMMITTED:避免脏读,但可能出现不可重复读。
    • REPEATABLE READ(MySQL默认):避免不可重复读,但可能产生幻读。
    • SERIALIZABLE:最高隔离,性能最低。

总结与应用建议

  1. 索引:优先为高频查询字段(如WHERE、JOIN条件)创建索引,但需平衡读写性能。
  2. 视图/存储过程:
  • 视图适合简化复杂查询,存储过程适合封装业务逻辑。

  • 避免过度使用存储过程,以免增加调试难度。

  • 事务:

  • 确保事务粒度适中,避免长时间持有锁。

  • 根据业务需求选择合适的隔离级别(如电商场景常用REPEATABLE READ)。

通过合理运用这些技巧,可显著提升MySQL的性能和可维护性。

相关推荐
vx_Biye_Design22 分钟前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
做运维的阿瑞1 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
java1234_小锋2 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
专业程序开发源2 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@15022072 小时前
canal做mysql的异步传输工具
数据库·mysql·linq
Shadow(⊙o⊙)3 小时前
MySQL C/C++链接MySQL使用
数据库·sql·mysql
FYKJ_20103 小时前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计
Mortalbreeze3 小时前
MySQL 基础篇(五):数据操作基础 —— CRUD
linux·服务器·数据库·mysql
Shadow(⊙o⊙)3 小时前
mysql为创建普通用户并创建库赋权
数据库·sql·mysql
Q26433650233 小时前
【有源码】基于springboot的知识产权管理系统-知识产权咨询问答管理系统-知识产权价值评估管理系统
java·spring boot·mysql·spring·毕业设计·javaweb·课程设计