飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 学习路径
  • 第1章 数据定义(DDL)

    • SQL简介
    • SQL语法
    • SQL注释
    • 创建数据库
    • 删除数据库
    • 创建表
    • 修改表
    • 删除表
    • 约束概述
    • NOT NULL约束
    • UNIQUE约束
    • PRIMARY KEY约束
    • FOREIGN KEY约束
    • CHECK约束
    • DEFAULT约束
    • 视图
    • 索引
    • 自增字段
    • 日期类型
  • 第2章 数据操作(DML)

    • 基础查询

      • SELECT查询
      • DISTINCT去重
      • LIMIT限制行数
      • 别名
      • 通配符
    • 条件过滤

      • WHERE条件筛选
      • AND运算符
      • OR运算符
      • NOT运算符
      • BETWEEN区间
      • IN运算符
      • LIKE模糊匹配
      • ORDER BY排序
    • 聚合函数

      • 聚合函数概述
      • COUNT计数
      • SUM求和
      • AVG平均值
      • MAX最大值
      • MIN最小值
    • 分组过滤

      • GROUP BY分组
      • HAVING过滤分组
    • 数据修改

      • INSERT插入数据
      • UPDATE修改数据
      • DELETE删除数据
      • NULL值处理
    • 表连接

      • JOIN连接概述
      • INNER JOIN内连接
      • LEFT JOIN左连接
      • RIGHT JOIN右连接
      • FULL JOIN全连接
      • SELF JOIN自连接
    • 集合操作

      • UNION并集
      • UNION ALL不去重并集
    • 高级查询

      • ALL运算符
      • ANY运算符
      • CASE条件表达式
      • EXISTS存在性检查
      • NULL处理函数
  • 第3章 事务控制(TCL)

    • COMMIT提交事务
    • ROLLBACK回滚
    • SAVEPOINT存档点
  • 第4章 数据控制(DCL)

    • GRANT授权
    • REVOKE撤销权限
    • SQL托管
    • SQL注入防护
  • 第5章 进阶主题

    • INSERT INTO SELECT复制数据
    • SELECT INTO复制表
    • 参数化查询
    • 预编译语句
    • 备份数据库
    • 存储过程
  • 第6章 参考

    • 关键字参考
    • 快速参考
    • 数据类型
    • 运算符

索引

索引加速数据检索——没有索引需要全表扫描,有索引可以快速定位目标行。

索引在表的一列或多列上创建,数据库引擎会维护一个排序的数据结构(通常是 B-Tree),让查询能快速定位目标行,避免全表扫描。索引会占用额外的磁盘空间,并且在 INSERT、UPDATE、DELETE 时需同步维护,所以不是越多越好——只在查询频繁的列(WHERE、JOIN、ORDER BY 涉及的列)上建索引。

MySQL 支持多种索引类型:普通索引(INDEX)仅加速查询;唯一索引(UNIQUE INDEX)加速查询 + 保证唯一性;全文索引(FULLTEXT)用于全文搜索;复合索引(多列组合)遵循最左前缀原则——查询条件必须包含最左边的列才能走索引。

什么场景需要它?当表的数据量达到万级以上时,索引带来的性能提升是数量级的。飞翔科技的员工表如果有百万条记录,按姓名查找员工若没索引就得扫描百万行;建个索引,可能只需几次 I/O 就找到了。在高并发系统中,合理的索引设计直接决定用户体验和系统吞吐量。

标准写法:

-- 创建普通索引
CREATE INDEX 索引名 ON 表名 (列名);

-- 创建唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名 (列名);

-- 创建复合索引
CREATE INDEX 索引名 ON 表名 (列名1, 列名2);

-- 删除索引
DROP INDEX 索引名 ON 表名;

以飞翔科技为例。员工表上为常用查询列创建索引:

-- 为姓名建索引,加速按姓名搜索
CREATE INDEX idx_emp_name ON employees (emp_name);

-- 为部门代码 + 入职年份建复合索引
-- 加速"技术部 2018 年入职员工"这类查询
CREATE INDEX idx_dept_join ON employees (dept_code, join_year);

-- 查询技术部(dept_code=2)2018 年入职员工
-- 此查询会走 idx_dept_join 索引
SELECT emp_name, basic_salary
FROM employees
WHERE dept_code = 2 AND join_year = 2018;

-- 查看表的索引情况
SHOW INDEX FROM employees;

主键和 UNIQUE 约束会自动创建索引,所以 emp_id 和 email 已经自带索引了。idx_dept_join 这样的复合索引,能同时加速 WHERE dept_code=...、WHERE dept_code=... AND join_year=... 以及 ORDER BY dept_code, join_year 等多种查询。用 EXPLAIN 关键字可以查看查询是否真的走了索引,这是优化 SQL 性能的基本功。

在线测试

上一页
视图
下一页
自增字段