索引
一、概念
-
在数据表的字段上添加,为了提高查询效率存在的一种机制
-
索引是为了缩小扫描范围而存在的一种机制
-
索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列
-
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
-
不要随意添加,需要维护;建议通过主键通过索引
二、实现原理
索引也是需要排序的,底层是一个自平衡的二叉树
三、说明
- 在任何数据库当中主键都会自动添加索引对象,id字段上自动创建索引
- 一个字段上如果有unique约束,也会自动创建索引对象
- 任何数据库当中的任何一张表任何一条记录在硬盘存储上都有 一个硬盘的物理存储编号
- 在mysql中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,
- myisam 存储引擎中,索引存储在一个.MYI文件中
- innodb存储引擎中,所有存储在一个逻辑名称叫做tablespace的当中
- memory存储引擎当中索引存储在内存中,不管索引存储在哪里,索引在mysql当中都是一个树的形式存在(自平衡二叉树:B-Tree)
四、字段添加索引
-
条件1.数据量庞大
-
条件2.该字段经常出现在where后,以条件的形式存在,该字段总是被扫描
-
条件3.该字段很少的DML(insert delete update)操作(因为DML之后,索引需要重新排序)
五、创建索引
create index 索引名 on 表名(字段)
六、删除索引
drop index 索引名 on 表名
七、查看索引
show index from 表名;
-- 查看某一字段
explain select * from 表名 where 字段= ‘值‘
explain select * from emp where ename=‘KING‘;
八、索引失效
1.查找内容中使用模糊查询
条件以‘%’开头,索引失效
select * from emp where ename like "%T"
2.使用or的时候
- 使用or 要求or两边字段都有索引,索引才能生效,但凡一边没有,索引不生效
- 建议使用union
3.使用复合索引的时候,没有使用左侧的列查找,索引失效
create index emp_job_sal on where(job,sal);
explain select * from emp where job= ‘MANAGER‘; -- 左侧的列查找
explain select * from emp where sal=800 ; -- 右侧的列查找索引失效
4.where 条件中,索引的字段参加运算,索引失效
create index emp_job_sal on where(sal);
explain select * from emp where sal=800 ;
explain select * from emp where sal+1=800 ; 字段运算索引失效
5.where 条件中,索引列使用了函数
create index emp_job_sal on where(job);
explain select * from emp where lower(job)= ‘MANAGER‘
九、索引分类
-
索引是数据库优化的重要手段
-
索引的分类
-
单一索引:一个字段上添加索引
-
复合索引:两个字段或更多的字段上添加索引
-
主键索引:主键上添加索引
-
唯一性索引:具有unique约束的字段上添加索引
-
注意:唯一性索引比较弱,字段上添加索引用处不大
-