一、索引介绍
索引,其实就是关键字和所在位置的一个映射关系
作用:快速的检索到查找的内容
例如:索引类似于新华字典的拼音检索,没有索引时,需要全表扫描,有了索引之后,可以快速的定位到查找的内容
二、索引威力体验
先安装测试数据库(30万条数据)
下载地址:https://github.com/datacharmer/test_db
解压压缩包:
解压之后,在cmd中切换到该目录下:
D:\1912A\Java基础\03.03\test_db-master
重新连接到mysql数据库服务器
使用explain 命令检测sql语句的执行情况
explain 执行的sql语句;
给first_name这个列加上索引之后,再来查看
添加索引:alter table employees add key 索引名字(列名);
例如:alter table employees add key fkey(first_name);
三索引分类
1.主键索引(primary key)
用来唯一的标识数据表中的某一条记录,必须用于整数列,例如:id
2. 唯一索引(unique key)
用来表示某一列的值,不能重复,必须用于字符列,例如:姓名、邮箱、昵称
普通索引(key)
最基本的索引,是我们经常使用到的索引。
一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;
- 联合索引
联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
例如索引是key index (a,b,c). 可以支持a |a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。
如果您知 道姓,电话簿将非常有用;
如果您知道姓和名,电话簿则更为有用,
但如果您只知道名不姓,电话簿将没有用处。
5. 全文索引
三、添加索引
第一种方法,在创建表时就指定索引:
create table index_test(
id int auto_increment,
name varchar(32),
age int,
introduce varchar(255),
primary key(id), --主键索引
unique key(name), --唯一索引
key(introduce), --普通索引
key(name,age) --联合索引
);
第二种方法,创建表之后再添加索引:
create table index_test2(
id int,
name varchar(32),
age int,
introduce varchar(255)
);
--修改数据表,添加索引
alter table index_test2 add primary key(id); --添加主键索引
alter table index_test2 add unique key(name); --添加唯一索引
alter table index_test2 add key(introduce); --添加普通索引
alter table index_test2 add key(name,age); --添加联合索引
添加索引之后,如何查看数据表有哪些索引?
show create table 表名;
四、删除索引
alter table 表名 drop primary key; 删除主键索引
alter table 表名 drop key 索引名称; 删除其他索引
五、索引应用场景
哪些场景适合用索引
1.出现在where条件中的字段
select * from index_test where name = “张三”;
这样就会去索引页查找name=张三的记录在什么位置
2.出现在order by排序中的字段
3.join关联查询字段,作为连接点的字段
频繁查询/使用的字段
哪些场景不适合用索引
1.不经常查询的字段不适合建索引
2.不会出现在WHERE子句中字段不该创建索引
3.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select * from emp where sex = '男‘
4. 更新非常频繁的字段不适合创建索引
select * from emp where logincount = 1
六、自主练习
大家比较一下连接查询时,没有索引时,翻多少页;添加索引之后,翻多少页就能找到需要的内容。
查询时,一定要使用where条件,否则会进行全表扫描(从第一页翻到最后一页)
即使前面查找到结果了,依然会查到最后一页