Python FastAPI 快速入门

admin

2025-11-23 05:21 阅读 1679

FastAPI框架开发高性能API的教程

MySQL 索引优化实战

索引是数据库性能优化的核心,正确使用索引可以让查询性能提升数十倍。

1. 索引类型

  • B+Tree 索引 - 最常用,适合范围查询
  • Hash 索引 - 只支持等值查询
  • 全文索引 - 用于文本搜索
  • 空间索引 - 用于地理数据

2. 创建索引

-- 单列索引
CREATE INDEX idx_name ON users(name);

– 复合索引
CREATE INDEX idx_name_age ON users(name, age);

– 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);

– 前缀索引
CREATE INDEX idx_title ON articles(title(20));

3. 最左前缀原则

-- 复合索引 (a, b, c)
-- 可以使用索引的查询:
WHERE a = 1
WHERE a = 1 AND b = 2
WHERE a = 1 AND b = 2 AND c = 3

– 无法使用索引:
WHERE b = 2
WHERE b = 2 AND c = 3
WHERE a = 1 AND c = 3 – 只能用到 a

4. EXPLAIN 分析

EXPLAIN SELECT * FROM users WHERE name = "John";

– 关键字段:
– type: 访问类型 (const > eq_ref > ref > range > ALL)
– key: 实际使用的索引
– rows: 扫描行数
– Extra: 额外信息

5. 索引失效场景

-- 函数操作导致失效
WHERE YEAR(create_time) = 2024  -- 失效
WHERE create_time BETWEEN ... AND ...  -- 有效

– 隐式类型转换
WHERE phone = 13800138000 – phone 是 varchar,失效
WHERE phone = “13800138000” – 有效

– LIKE 前导通配符
WHERE name LIKE “%john” – 失效
WHERE name LIKE “john%” – 有效

– OR 连接非索引列
WHERE indexed_col = 1 OR non_indexed = 2 – 可能失效

6. 覆盖索引

-- 索引 (name, age)
-- 覆盖索引查询,无需回表
SELECT name, age FROM users WHERE name = "John";

– 需要回表获取其他字段
SELECT * FROM users WHERE name = “John”;

7. 索引优化建议

  • 为 WHERE、ORDER BY、JOIN 的列创建索引
  • 选择区分度高的列作为索引
  • 避免过多索引,影响写入性能
  • 定期分析慢查询日志
  • 使用 pt-query-digest 分析查询
0 条评论