什么是索引?
索引是一种帮助数据库获得高效查询效率的数据库对象,该数据库对象使用了特殊的数据结构,以B树和Hash树最
为常见,MySQL中索引默认使用的是B树
索引的利
- 减少IO操作次数,提供查询效率
- 降低CUP使用率(在排序操作中尤为明显)
索引的弊
- 占据大量的硬盘存储空间
不适用索引的情况
- 数据量小的表
- 频繁变动的字段
- 不经常查询的字段
- 降低DML操作的效率
适合建立索引的情况
- 表的主键、外键必须有索引;
- 数据量超过300的表应该有索引;
- 经常与其他表进行连接的表,在连接字段上应该建立索引;
- 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
- 索引应该建在选择性高的字段上;
- 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
- 频繁进行数据操作的表,不要建立太多的索引;
- 删除无用的索引,避免对执行计划造成负面影响;
索引的分类
- 主键索引 (主键创建是自动添加,无法删除修改)
- 单列索引 (单独对表中的某个列数据建立索引)
- 唯一索引 (值不能重复的索引)
- 复合索引 (多个列的值组成的索引,当第一个列的值重复时,按照后面的组合必须查找数据复合索引相当于字典的二级目录,当前一个值一致时,再使用后一个值做筛选) -----------> 用的最多
查看SQL执行计划
语法:
explain 查询语句;
其中type是我们需要优化的:其值常见的有以下几个,按照执行性能排列为
systme > const > eq_ref > ref > range > index > all
const: 根据主键索引或者唯一索引查询到的结果
explain select id,name from employee where id = 1;
ref: 使用非唯一性索引做查询,返回匹配的记录行,常见于多表查询中
explain select * from department d join employee e on d.id = e.dept_id;
range: 索引做范围查询,常见于<、<=、>、>=、between等操作符
explain select age from employee where age >= 20 and age <= 30
index: 索引全查询,MySQL遍历整个索引来查找匹配的行。
explain select age from employee where age >= 20SQL优化的目标之一要把type优化在ref到index之间,该值没有优化的情况下一般都是all