什么是索引?

索引是一种帮助数据库获得高效查询效率的数据库对象,该数据库对象使用了特殊的数据结构,以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 >= 20

SQL优化的目标之一要把type优化在ref到index之间,该值没有优化的情况下一般都是all