MySQL 学习记录- 索引 Day19

(1)什么是索引?

索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。在数据表字段创建索引的时候,实际上就是额外在创建一个某种存储格式的表(可以理解为书本的目录,有目录就能迅速找到想要查找的内容)按存储格式分有哈希索引(Hash index)和二叉树索引(btree index),查找单值时使用哈希索引,查找范围时使用二叉树索引。
PS:如果没有索引的话,Mysql必须从第一条记录开始读完整个表,直到找出相关行,数据越大,查询的时间越长。

(2)索引的优缺点?

优点:
1.约束功能
2.加速查找
缺点:
1.索引虽然可以加速查找,但是对数据进行增删改时,索引也要进行动态地维护(查询快,增删改慢)
2.索引需要占磁盘空间

(3)索引的分类?

1.主键索引:加速查找+不能为空+不重复
2.唯一索引:加速查找+不重复
3.普通索引:加速查找
4.单列索引:一个索引只包含单个列
5.组合索引:在表的多个字段组合上创建索引(最左前缀匹配原则)
6.索引合并:使用多个单列索引进行查找(索引合并的效率<组合索引)
7.覆盖索引:直接在索引表里取得数据这一操作

(4)创建、删除、查看索引

创建索引:

alter table score add index numberidx(number); #方法一
create index numberidx on score(number); #方法二
#create (unique) index 索引名称 on 表名(列名,........)

删除索引:

alter table score drop index numberidx; #方法一
drop index numberidx on score; #方法二
#drop (unique) index 索引名称 on 表名

查看索引:

show index from score;
show create table score;

(5)如何命中索引?

创建了索引,如果不能命中的话,也是能够加速查找。
不能命中索引的情况有如下(主键除外):
1.通配符模糊查找- like '%xx’

select * from tb1 where email like '%cn';

2.-使用函数

select * from tb1 where reverse(email) = 'wupeiqi';
#emial倒序排了之后,索引表找不到对应的id路径,相当于没去索引表里找

3.or(可能会不走索引)

select * from tb1 where nid = 1 or name = '[email protected]';

当nid创建了索引,而name没有创建索引,则查询也没法命中索引

以下有特殊情况,or有可能命中索引

select * from tb1 where nid = 1 or name = 'seven';#不能命中索引
select * from tb1 where nid = 1 or name = '[email protected]' and email = 'alex';#可以命中索引

nid,email创建了索引,name没有创建索引

4.类型不一致
如果列是字符串类型,传入条件是必须用引号引起来。例如:本来要字符型数字才能命中索引,如果不小心写成了数字型数字的话,mysql不会报错,但是会内部进行数据类型转换,无法命中索引,查询速度慢。

select * from tb1 where QQnumber="796245310"; #命中索引
select * from tb1 where QQnumber=796245310; #不能命中索引

5.!=,不等于

select * from tb1 where QQnumber !="796245310" #不能命中索引

6.>,大于

select * from tb1 where number > 520  #不能命中索引

7.order by 分组
QQnumber创建了索引,name没有创建索引。

select name from tb1 order by QQnumber

当根据索引字段排序时候,选择的映射如果不是索引,依然无法命中索引

8.最左前缀匹配
如果组合索引没有遵循最左前缀原则的话,也是没法命中索引

(6)执行计划【让mysql预估执行操作耗时(一般正确)】

#explain + SQL语句,可以用来预估SQL语句的执行时间
explain select * from score where course_id in (select cid from course where teacher_id=1);

在这里插入图片描述
id:序号
select_type:指定select的查询类型,有simple,primary,union,subquery
table:被查询的表名
type:用来参考执行时间的快慢,一般按照如下顺序来参考快慢,all最慢,system/const最快
all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
all:全表扫描,全表遍历一次
index:全索引扫描,对索引全部遍历一次
range:对索引进行范围查找
index_merge:合并索引,使用多个单列索引搜索
ref:根据索引查找一个或多个值
eq_ref:连接时使用了primary key 或 unique类型
system/const:表中只有一行
possible_key:列出在搜索数据记录时可选用的索引有哪一些
key:Mysq执行这条查询语句时l实际选用的索引
key_len:索引按字节计算的长度,这个值越小,表示越快
ref:给出了关联关系中另一个数据表里的数据列名
rows:Mysql执行语句时大概会扫描多少行记录
extra:提供了与关联操作的有关信息

(7)索引的设计原则

1.避免对经常更新的表进行过多的索引
2.数据量小的表最好不要使用索引
3.不同值较多的列创建索引,避免在不同值较少的表创建索引,例如性别字段
4.对频繁进行 group by 和 order by 的字段上创建索引

你可能感兴趣的:(mysql)