9索引与视图
MySQL 第6章 索引与视图(教学博客|扩充版)
适合初学者 + 包含工作高频知识点
本章核心:索引加速查询、视图简化开发+提高安全,是MySQL最常用、面试/工作必问的两大核心对象。
一、索引(Index)—— 数据库的“目录”
1.1 索引是什么(通俗讲)
索引就是数据表的目录,像书的目录一样:
- 没有索引:逐行扫描(慢,数据量大卡死)
- 有索引:直接定位(快,秒查)
一句话:索引=加速查询
1.2 索引分类(工作必懂5种)
- 普通索引(INDEX/KEY):最常用,仅加速
- 唯一索引(UNIQUE):值不能重复
- 主键索引(PRIMARY KEY):唯一+非空+自动索引
- 全文索引(FULLTEXT):大文本模糊搜索(文章、内容)
- 空间索引(SPATIAL):地理坐标(经纬度)
1.3 单列索引 vs 复合索引(工作高频)
- 单列索引:一个字段建索引
- 复合索引:多个字段一起建索引
复合索引规则(面试必考):最左匹配原则
复合索引(a,b,c)
查询条件必须包含最左边a,索引才会生效。
1.4 索引优缺点(工作必背)
优点:查询超快
缺点:
- 占用磁盘空间
- 增删改(INSERT/UPDATE/DELETE)变慢
- 索引越多,写越慢
工作建议:
- 查询频繁的字段才建索引
- 不要乱建、不要全建(索引泛滥=数据库变慢)
二、索引的创建、查看、删除(上课+工作直接用)
2.1 创建索引(3种方式)
方式1:建表时直接创建(最常用)
CREATETABLEemp(empnoINTPRIMARYKEY,-- 主键索引enameVARCHAR(20)UNIQUE,-- 唯一索引jobVARCHAR(20),INDEXidx_job(job)-- 普通索引);方式2:已有表用 CREATE INDEX
-- 普通索引CREATEINDEXidx_enameONemp(ename);-- 唯一索引CREATEUNIQUEINDEXidx_deptnoONemp(deptno);-- 复合索引CREATEINDEXidx_dept_salONemp(deptno,sal);方式3:ALTER TABLE 添加索引
ALTERTABLEempADDINDEXidx_job(job);2.2 查看索引
-- 查看所有索引SHOWINDEXFROMemp;-- 查看表结构(含索引)SHOWCREATETABLEemp;-- 分析SQL是否走索引(工作神器)EXPLAINSELECT*FROMempWHEREename='张三';工作提示:
EXPLAIN是调优神器,看key字段:有值=走索引,NULL=没走
2.3 删除索引
-- 方式1DROPINDEXidx_jobONemp;-- 方式2ALTERTABLEempDROPINDEXidx_job;三、视图(View)—— 虚拟表、安全又省事
3.1 视图是什么(通俗讲)
视图=虚拟表,不存真实数据,只存查询语句。
- 数据来自真实表(基本表)
- 视图只能读/改真实表
- 删视图,真实表没事
3.2 视图三大好处(工作天天用)
- 简化复杂查询:多表关联一次写好,以后直接查视图
- 安全控制:给用户只看指定字段(隐藏手机号、密码)
- 解耦:表结构变了,视图不改,程序不用改
3.3 创建视图(单表/多表)
单表视图
CREATEVIEWview_empASSELECTempno,ename,jobFROMemp;多表视图(工作最常用:员工+部门)
CREATEVIEWview_emp_deptASSELECTe.empno,e.ename,d.dnameFROMemp eJOINdept dONe.deptno=d.deptno;3.4 查看视图
DESCview_emp;SHOWCREATEVIEWview_emp;3.5 修改视图
CREATEORREPLACEVIEWview_empASSELECTempno,ename,job,salFROMemp;3.6 删除视图
DROPVIEWview_emp;3.7 通过视图操作数据(工作常用)
视图本质是操作真实表
-- 插入INSERTINTOview_emp(empno,ename)VALUES(1001,'小明');-- 修改UPDATEview_empSETename='小红'WHEREempno=1001;-- 删除DELETEFROMview_empWHEREempno=1001;注意:
视图不能包含:
- 聚合函数、GROUP BY、DISTINCT、JOIN(部分)
→ 这类视图不能增删改,只能查
四、工作高频总结(面试/开发必考)
索引工作经验
- 主键一定建索引(自动)
- 查询条件、WHERE、JOIN、ORDER BY 字段优先建索引
- 复合索引遵守最左匹配
- 不要在性别、状态这种低基数字段建索引(没用)
- 索引不是越多越好,增删改会变慢
视图工作经验
- 视图用于权限隔离、简化报表
- 视图不存数据,真实表变,视图自动变
- 复杂多表查询封装成视图,开发效率翻倍
- 视图不能替代表,不能建索引(MySQL限制)
五、上课可直接运行 SQL(索引+视图完整版)
-- 1. 创建部门表CREATETABLEdept(deptnoINTPRIMARYKEY,dnameVARCHAR(20));INSERTINTOdeptVALUES(10,'总裁办'),(20,'研究院');-- 2. 创建员工表(带索引)CREATETABLEemp(empnoINTPRIMARYKEY,enameVARCHAR(20)UNIQUE,jobVARCHAR(20),salDECIMAL(7,2),deptnoINT,INDEXidx_sal(sal),INDEXidx_deptno_sal(deptno,sal));INSERTINTOempVALUES(9901,'张三','经理',5000,10),(9902,'李四','开发',4000,20);-- 3. 查看索引SHOWINDEXFROMemp;-- 4. 创建视图(员工+部门)CREATEVIEWview_emp_deptASSELECTe.empno,e.ename,d.dnameFROMemp eJOINdept dONe.deptno=d.deptno;-- 5. 查询视图SELECT*FROMview_emp_dept;本章一句话总结
- 索引=加速查询、慢写
- 视图=虚拟表、简化+安全
