索引
基本概念
通过给字段名上增加索引,可以提高查询的效率。
一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引。索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。
select * from t_user where name = 'jack';
如果name字段没有索引,系统会将所有name中的字段值一个个地进行匹配,
如果name字段有索引,会通过jack的索引首先找到一个大致地方位,避免全局进行扫描匹配,从而提高效率。
索引是一种将我们存入的数据进行有序存储的机制,通过对数据进行有序存储,就可以使用类似二分查找之类的算法进行快速查找。
实现原理
在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是PK。另外在mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
在任何数据库当中,任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号。
在mysql当中,索引是一个单独的对象,不同的存储引擎以不同的形式存在,在MyISAM存储引擎中,索引存储在一个.MYI文件中。在InnoDB存储引擎中,索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中。不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)
MySQL中的主键和unique
约束字段会自动增加索引。
什么时候增加索引呢?
- 数据量庞大
- 该字段值经常出现在
where
语句中,作为条件的存在,这说明这个字段经常被扫描。 - 这个字段很少用到DML操作(因为每次的DML操作都会导致索引重新排序)。
建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。
索引的查询,创建,删除
- 查询一个SQL语句是否用到了索引进行查询?
使用explain
关键字
explain select * from emp where ename='KING';
没有使用索引:
这里的rows=14
说明查了14行数据,逐行遍历了属于是。同时type=all
,说明是全局扫描进行查询的。
使用索引:
这里的rows=1
,type=ref
,key=emp_ename_index
说明是使用了索引进行搜索的。
- 创建索引
给表y
中的x字段
创建索引z
create index 索引名z on 表y(字段名x);
- 删除索引
将表x
中的索引y
删除
drop 索引名y on 表名x;
索引失效
- 1.使用模糊搜索的时候,模糊匹配使用%或者_开头就会失效
- 2.使用or的时候,要求or两边的字段都要有索引才会使用索引进行搜索,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效。
- 3.使用复合索引,没有使用左侧的列查找,索引失效
复合索引:两个字段或者多个字段联合起来添加索引
create index emp_job_sal_index on emp(job,sal);
正常使用索引,用job字段作为条件查询
索引失效,没有使用job字段作为条件查询
- 4.在where当中索引列参加了运算,索引失效
create index emp_sal_index on emp(sal);
explain select * from emp where sal = 800;// 使用了索引
explain select * from emp where sal+1 = 800;// 索引失效
正常使用索引:
索引失效:
- 5.在where当中索引列使用了函数
索引的分类
- 单一索引 一个字段上添加索引
- 复合索引 多个字段联合添加索引
- 主键索引 有主键的字段的索引
- 唯一性索引
uniuqe
约束字段的索引
唯一性较弱的字段上添加索引的用处不大。