【Mysql】之索引详解
一、索引基础
1.1 定义
索引是一个排序的列表,包含索引字段的值及其对应的行数据记录所在的物理地址.
1.2 作用
加快数据表的查询速度(主要作用),还可以对字段排序,加快表与表的连接速度,减少分组和排序的时间
1.3 副作用
索引会额外占用磁盘空间;更新包含索引的表会花费更多时间
二、工作方式
没有索引的情况下,要查询某行数据记录时,需要先扫描全表,再定位某行数据记录的位置。
有了索引后,会先通过索引查询行数据记录所在的物理地址,即可直接访问相应的行数据记录,就像通过书的目录页码快速查找书内容一样。
三、创建索引的依据
1、表的行数据记录较多时(一般超过三五百行时),且读操作多的情况下应该要创建索引
2、建议在表的 主键/外键字段、多表连接的公共字段、唯一性较好的字段、不经常更新的字段、where条件的字段、group by分组的字段、order by排序的字段、简短的字段 上面创建索引
3、不建议在 唯一性较差的字段、更新太频繁的字段、大文本字段 上面创建索引
四、索引类型
4.1 普通索引
create index 索引名 on 表名(字段);
alter table 表名 add index 索引名(字段);
create table 表名 (.... , index 索引名(字段));
4.2 唯一索引
create unique index 索引名 on 表名(字段);
alter table 表名 add unique 索引名(字段);
create table 表名 (.... , unique 索引名(字段));
4.3 主键索引
alter table 表名 add primary key(字段);
create table 表名 (.... , primary key(字段));
4.4 多列组合索引(适用于普通索引、唯一索引、主键索引)
create index 索引名 on 表名(字段1, 字段2, 字段3, ....);
alter table 表名 add index 索引名(字段1, 字段2, 字段3, ....);
#查询语句使用 and 做逻辑运算符时,where子句的条件字段顺序要与创建多列组合索引的字段顺序一致(要满足最左执行原则)
select 字段 from 表名 where 字段1=XX and 字段2=XX and 字段3=XX ;
4.5 全文索引(只能在char、varchar、text等字符数据类型字段上创建)
create fulltext index 索引名 on 表名(字段);
alter table 表名 add fulltext 索引名(字段);
create table 表名 (.... , fulltext 索引名(字段));
#全文索引可用于做全文模糊查询
select 字段 from 表名 where match(字段) against('单词');
五、索引操作
5.1 删除索引
drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
alter table 表名 drop primary key;
5.2 查看索引
show create table 表名;
show index from 表名;
show keys from 表名;
5.3 导致索引失效的几种情况
1、where子句中对字段进行null判断
select 字段 from 表名 where 字段 is null;
2、where子句中使用不等于判断
select 字段 from 表名 where 字段 != XX ;
elect 字段 from 表名 where 字段 <> XX ;
3、where子句中对字段进行表达式或函数操作
select 字段 from 表名 where 字段/2 = 10;
select 字段 from 表名 where 函数(字段) = XX ;
4、where子句中使用like查询并将%放在开头
select 字段 from 表名 where 字段 like '%XX';
5、where子句中字段顺序和多列组合索引的字段顺序不一致
索引(字段2, 字段1)
where 字段1=XX and 字段2=XX;
六、补充
如果出现select查询语句执行速度慢的情况,可能原因:
1、缺少索引;
2、索引失效;
3、SQL语句语法有问题;
4、mysql配置文件参数设置得不合理;
5、数据表太大了;别的应用导致服务器负载过高;硬件性能不足
抛开其它原因的影响,如果是索引的原因导致select执行速度慢,要先使用 explain 分析 select 语句(看key、rows、type等字段),判断这个select语句是否正确的使用了索引,再根据select语句中的where子句使用的条件字段创建相应的单列索引或多列组合索引(要满足最左执行原则),并保证select语句中避免出现上面几种导致索引失效的情况。