索引本身是一个独立的存储单位,在该单位里边有记录着数据表某个字段和字段对应的物理空间。
如下:
有了索引,我们根据索引为条件进行数据查询速度就非常快
- 索引本身有”算法”支持,可以快速定位我们要找到的关键字(字段)
- 索引字段与物理地址有直接对应,帮助我们快速定位要找到的信息,一个数据表的全部字段都可以设置索引
索引类型
四种类型:
类型 | 英文名 | 含义 |
---|---|---|
主键 | primary key | auto_increment必须给主键索引设置,信息内容要求不能为null且唯一 |
唯一 | unique index | 信息内容不能重复 |
普通 | index | 没有具体要求 |
全文 | fulltext index | myisam数据表可以设置该索引 |
复合索引:索引关联的字段是多个组成的,该索引就是复合索引。
例:
- 创建复合索引:
- 删除主键索引
先去除主键字段的auto_increment属性
执行计划explain
- 当前数据库只有查询语句支持执行计划。
- 每个select查询sql语句执行之前,需要把该语句需要用到的各方面资源都计划好
例如:cpu资源、内存资源、索引支持、涉及到的数据量等资源 - 查询sql语句真实执行之前所需要的资源计划就是执行计划。
我们讨论的执行计划,就是看看一个查询sql语句是否可以使用上索引。
例:(使用了索引)
比较:(未使用索引)
适合场景
- where 之后设置的查询条件字段都适合做索引。
- order by 字段 //排序字段适合做索引
例:
排序字段没有索引,做排序查询就没有使用:
给排序字段设置索引,做排序查询就会使用:
- 连接查询中给外键/约束字段设置索引,也可以提高联表查询的速度
索引覆盖
例:
给ename和job设置一个复合索引:
我们查询的全部字段(ename,job)已经在索引里边存在,就直接获取即可,不用到数据文件中再获取了,该查询速度非常快,效率高,该索引也称为”黄金索引”:
索引缺陷:索引本身需要消耗空间存储且升级维护困难
索引原则
字段独立原则
select * from emp where empno=1325467; #empno条件字段独立
select * from emp where empno+2=1325467; #empno条件字段不独立
条件字段独立可以使用索引:
条件字段不独立不可以使用索引:
两者的时间比较:
左原则
模糊查询中,特殊占位符的使用:
- %:关联多个模糊内容
- _:关联一个模糊内容
select * from 表名 like "beijing%"; #使用索引
select * from 表名 like "beijing_"; #索引索引
查询条件信息在左边出现,就能使用索引
XXX% YYY_ 使用索引
%AAA% _ABC_ %UUU 不使用索引
中间条件查询(没有使用索引):
右边条件查询(没有使用索引):
左边条件查询(使用索引):
复合索引内部有两个字段(ename,job)
- ename(前者字段)作为查询条件可以使用复合索引
- job(后者字段)作为查询条件不能使用复合索引
复合索引的第一个字段可以使用索引:
复合索引的其余字段不能使用索引:
如果第一个字段的内容已经确定好,第二个字段也可以使用索引:
OR原则
or左右的关联条件必须都具备索引 才可以使用索引:
or的左右,只有一个有索引,导致整体都没有的使用: