前言
本章我们将学习MySQL中的索引,本文将从索引的作用、索引的分类、创建索引的语法、索引的使用策略以及索引的实现原理等方面带大家了解索引。
索引的作用
索引的作用就是加快查询速度,如果把使用了索引的查询看做是法拉利跑车的话,那么没有用索引的查询就相当于是自行车。目前实际项目中表的数据量越来越大,动辄上百万上千万级别,没有索引的查询会变得非常缓慢,使用索引成为了查询优化的必选项目。
索引的概念
索引其实是一种特殊的数据,也保存在数据库文件中,索引数据保存着数据表中实际数据的位置。类似书籍前面的目录,这个目录就保存了书中各个章节的页数,通过查看目录我们可以快速定位章节的页数,从而加快查找速度。
我们来看一段查询语句:
select * from book where id = 1000000;
假设书籍表中有几百万行数据,没索引的查询会遍历前面的100万行数据找到结果,如果我们在id上建立主键索引,则直接在索引上定位结果,速度要快得多。
索引的优缺点
优点:提高查询速度
缺点:本身也是数据,会占用磁盘空间;索引的创建和维护也需要时间成本;进行删除、更新和插入操作时,因为要维护索引,所以速度会降低。
使用索引的语法
创建索引
建表的同时创建索引
create table 表名
(
字段名 类型,
...
字段名 类型,
index 索引名称 (字段名)
);
建表后添加索引
alter table 表名 add index 索引名(字段名);
或
create index 索引名 on 表名(字段名);
删除索引
alter table 表名 drop index 索引名;
或
drop index 索引名 on 表名;
查看表中的索引
show index from 表名;
查看查询语句使用的索引
explain 查询语句;
索引的分类
索引按功能分为:
普通索引,在普通字段上建立的索引,没有任何限制
主键索引,创建主键时,自动创建的索引,不能为空,不能重复
唯一索引,建立索引的字段数据必须是唯一的,允许空值
全文索引,在大文本类型(Text)字段上建立的索引
组合索引,组合多个列创建的索引,多个列不能有空值
代码示例:
-- 创建书籍表create table tb_book( -- 创建主键索引 idint primary key, -- 创建唯一索引 titlevarchar(100) unique, authorvarchar(20), contentText, timedatetime, -- 普通索引 indexix_title (title), -- 全文索引 fulltextindex ix_content(content), -- 组合索引 indexix_title_author(title,author));-- 建表后添加主键索引ALTER TABLE tb_book ADD PRIMARY KEY pk_id(id);-- 建表后添加唯一索引ALTER TABLE tb_book ADD UNIQUE index ix_title(title);-- 建表后添加全文索引ALTER TABLE tb_book ADD FULLTEXT indexix_content(content);-- 查询时使用全文索引SELECT * FROM tb_book MATCH(content) ANGAINST(‘胜利’);-- 建表后添加组合索引ALTER TABLE tb_book ADD INDEX ix_book(title,author);
注意:创建组合索引时,要遵循”最左前缀”原则,把最常查询、排序的字段放左边,按重要性依次递减。
索引的使用策略
什么情况下要建立索引?
1)在经常需要查询和排序的字段上建立索引
2)数据特别多
什么情况下不要建立索引?
1)字段数据存在大量的重复,如:性别
2)数据很少
3)经常需要增删改的字段
什么情况下索引会失效?
1)模糊查询时,使用like ‘%张%’会失效,而like ‘张%’不会
2)使用is null或is not null查询时
3)使用组合索引时,某个字段为null
4)使用or查询多个条件时
5)在函数中使用字段时,如where year(time) = 2019
总结
索引是提高查询速度的重要手段,本章我们学习了索引的分类和创建语法,以及使用索引的策略,不是所有的表都适合创建索引,最后我们还学习了索引的内部结构,这样大家对索引会有一个基本的认识。