MySQL索引

索引

概念:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址

作用

1、利用索引,数据库可以快速定位,大大加快查询速度(主要作用)

2、表的数据很大、很多或者查询需要关联多个表,这个时候使用索引可以提高查询速度

3、加快标语表之间的连接

4、在分组和排序时,可以大大减少时间

5、可以提高数据库恢复数据时的速度

索引创建的原则

有索引,数据会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担

①主键、外键必须有索引(创建好了主键和外键自动那个就是索引,不需要额外声明)

②一表超过300行记录,必须要有索引,否则数据库会遍历表的所有数据

③互相之间有关联的表,在这个关联字段上一定要设置索引

④唯一性太差的字段,不适合设置索引

⑤更新太频繁的字段不适合做索引

⑥经常被where条件匹配的字段,尤其是表数据多的,应该创建索引

⑦在经常进行group by(分组语句)、order by(排序语句)的字段上要建立索引

索引的列的字段越小越好,长文本的字段不适合建立索引

索引的类型

①B-树(BTREE)

树形结构索引,也是大部分数据库的默认类型

根节点:树的最顶端的分支节点

分支节点:指向索引里其他的分支节点或者叶子节点

叶子节点:指向表里的数据行

创建索引

②哈希索引

散列索引 把任意长度的输入,通过散列算法变换成固定长度的输出。散列值分别对应数据里的行和列

MySQL索引_第1张图片

MySQL的默认引擎是innodb,默认的索引类型就是BTREE

MEMORY引擎可以支持哈希索引,且默认索引就是哈希索引

先算散列值,然后再对应,速度比较慢,比BTREE慢

hash的索引匹配: =in() <=>

查看表的索引

create table test (

id int(4) primary key,

name char(10),

sex char(3),

);

show index from test;

索引的副作用

1、索引也需要占用额外的磁盘空间 innodb表数据文件本身也是索引,myisam:索引和数据文件是分离的

2、更新一个包含索引的表,要比更新一个没有索引表花费的时间更多。更新值了值,也就是更新索引。

创表时候需要考虑的因素

1、关联程度 3张表,选好关联字段

2、每个字段的长度,也要考虑。

3、设计合理的索引列。

4、表数据,要控制在合理的范围之内。可以在牺牲一定性能的条件下,满足需求。5秒以上就要考虑优化了。10秒以上一般是出问题了。(缓存失效,缓存击穿,缓存雪崩。)

唯一索引

unique 与普通索引类似,唯一索引的每个值都是唯一,唯一索引允许空值。

添加唯一键才会创建唯一键。最好不要为空。unique  not null

⭐ 能在建表时创建好的条件,尽量在创建把条件约束好,不要创完之后再添加

逐渐索引

创建表的时候指定的主键就是索引。添加主键自动就是主键索引。

主键:①值为一;②一个表只能有一个主键;③主键不能有空值;④创建主键自动创建主键索引

全文索引

适合在进行模糊查询时使用,可以在一边文章中检索文本信息

一般用于text

联合索引

指定一个索引名下有多个列名(组合索引)

联合索引,查询时必须按照穿件时的顺序来进行查询

范围查询,有可能右侧的索引会失效

MySQL索引_第2张图片

where is not null 数据多数不为空,索引失效

索引

普通索引

主键索引

唯一索引

全文索引

联合索引

创建索引时,注意索引失效的情况(最前面加个explain)

explain select * from try where age > 12 and address = '1';

面试:一张表的查询速度是7.62s,怎么加快查询速度?排查思路?

答:①先查缓存,看是不是请求直接到了后端数据库。

②再看索引,请求的列值不是默认的索引,添加一下即可。explain

你可能感兴趣的:(mysql,数据库)