帮助mysql高效获取数据的结构,本质上索引是数据结构。
目的:在于提高查询效率,可以类比字典。
举例
如果要查找“mysql”这个单词,在已经有索引的条件下,我们肯定需要定位到m字母,然后定位到y字母,再找到剩下的sql。
如果没有索引,那么你可能需要a----z,这个时间复杂度会超级高
总结
索引为排好序的快速查找数据结构。
影响:where 后面的查找和order by之后的排序
数据库中,除了数据本身外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据。这样就可以在这些数据结构的基础上实现高级查算法,这种数据结构就是索引。
索引存在哪里:文件形式存在磁盘
优势:
(1)类似大学图书馆建立书目索引,提高数据检索的效率,降低数据库的IO成本
(2)通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
劣势:
(1)实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也占空间
(2)索引可以提高查询速度,但是降低了更新表的速度,如insert,update,delete,更新表也要更新索引。
(3)索引只是提高效率的一个因素,必须是有效的索引
分类:单列索引,组合索引
单列索引
(1)一个索引只包含一个列
(2)可以存在多个单列索引
(3)单列索引分为:主键索引,唯一索引,普通索引
组合索引
一个组合可以包含两个或者两个以上的列
创建一个普通索引
方式一
create index 索引名 on 表名(字段名)
方式二
alter table 表名 add index 索引名 【using {btree|hash}】 on(字段名)
例如:在学生表stu的学号列上的前5个字符建立一个索引stu_id
方式一
create index stu_id on stu(学号(5),asc);
方式二
alter table stu add index stu_id 【using {btree|hash}】on (学号(5),asc);
创建唯一索引,与普通索引类似,必须唯一,可以存在空值
索引列的值必须唯一,可以为空
方式一
create unique index 索引名 on 表名(字段名)
方式二
alter table 表名 add unique 【using {btree|hash}】on (字段名)
创建主键索引,必须唯一,不可以存在空值
方式一
创建表的时候添加
方式二
alter table 表名 add primary key 【using {btree|hash}】(字段名)
组合索引
以上的语句中,字段定义多个,用,分割,只有一个索引名称
方式一
create index 索引名 on 表名(字段名,字段名)
方式二
alter table 表名 add index 【using {btree|hash}】(字段名,字段名)
例如
方式一
create index fuhe_id on stu(学号,课程号)
方式二
alter table stu add index 【using {btree|hash}】(学号,课程号)
查看表中索引情况
show index from 表名;
创建表的过程创建索引:
#正常创建表
create table 【if not exists】表名(
列名 数据类型,
列名 数据类型,
列名 数据类型,
primary key 【using{hash|btree} 】(列名,列名),
index 【key】【using{hash|btree} 】(列名,列名),
unique 【key】【using{hash|btree} 】(列名,列名),) ;
删除索引
方式一
drop index 索引名称 on 表名;
方式二
alter table 表名 drop primary key| drop index key 索引名 foreign key 外键名;
explain 命令
直接在select 语句之前加入即可
显示如何使用索引来处理select语句以及连接表
哪些情况适合建立索引:
(1)主键自动建立唯一索引
(2)频繁作为查询条件的字段应该创建索引
(3)查询中与其他表关联的字段,外键关系建立索引
(4)查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
(5)查询中统计或者分组字段
哪些情况不适合建立索引:
(1)频繁更新的字段不适合建立索引
(2)where条件里用不到的字段不适合建立索引
(3)单键/组合索引的选择问题,(高并发下倾向创建组合索引)
(4)表记录太少(300万)
(5)经常增删改的表
(6)数据重复且分布平均的表字段