索引
概述
索引是一种特殊的查询表,可以被数据库搜索引擎用来加速数据的检索。简单说来,索引就是指向表中数据的指针。
EXPLAIN
用于观察SQL执行计划,主要看有没有执行索引
主要看两列的结果(key和possible_keys)
分类
- 单值索引
一个索引只包括一个列,一个表可以有多个列CREATE INDEX 索引名 ON dept(表名)#普通索引即为单值索引
- 唯一索引
索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引-- 唯一索引,修改表结构,添加唯一索引
ALTER TABLE emp ADD UNIQUE(ename)
- 复合索引
一个索引同时包括多列-- 复合索引
ALTER TABLE emp ADD INDEX 索引名(要添加索引的列,····,···)
ALTER TABLE emp ADD INDEX many_index(ename,job,hiredate)
最左特性
复合索引中所查询的语句必须要包含最左边的字段,否则索引不会生效
索引的语法
创建索引
主键会自动创建索引
CREATE INDEX job_index ON dept(job)
CREATE INDEX 索引名 ON dept(表名)
查看索引
SHOW INDEX FROM dept
使用索引
EXPLAIN #用于观察SQL执行计划,主要看有没有执行索引
#主要看两列的结果(key和possible_keys)
SELECT * FROM emp WHERE job = '经理' #底层使用job索引
EXPLAIN
SELECT * FROM emp WHERE empno = 100 #底层使用主键索引
EXPLAIN
SELECT * FROM emp WHERE ename = 'jack' #底层使用唯一索引
EXPLAIN
SELECT * FROM emp WHERE ename = 'jack' AND job = '副总' #复合索引生效
EXPLAIN
SELECT * FROM emp WHERE hiredate = '2019-03-19' #复合索引失效,没有使用最左特性
优缺点
优点
- 索引是数据库优化
- 表的主键会默认自动创建索引
- 每个字段都可以被索引
- 大量降低数据库的IO磁盘读写成本,极大提高了检索速度
- 索引事先对数据进行了排序,大大提高了查询效率
缺点
- 索引本身也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也要占用空间
- 索引表中的内容,在业务表中都有,数据是重复的,空间是“浪费的”
虽然索引大大提高了查询的速度,但对数据的增、删、改的操作需 - 更新索引表信息,如果数据量非常巨大,更新效率就很慢,因为更新表时,MySQL不仅要保存数据,也要保存一下索引文件
- 随着业务的不断变化,之前建立的索引可能不能满足查询需求,需要消耗我们的时间去