索引
概念:索引是一个排序的列表,列表当中存储的是索引的值和包含这个值的数据所在行的物理地址
作用:
1、利用索引,数据库可以快速定位,大大加快查询速度(主要作用)
2、表的数据很大、很多或者查询需要关联多个表,这个时候使用索引可以提高查询速度
3、加快标语表之间的连接
4、在分组和排序时,可以大大减少时间
5、可以提高数据库恢复数据时的速度
索引创建的原则
有索引,数据会先进行索引查询,然后定位数据,索引使用不当,反而会增加数据库的负担
①主键、外键必须有索引(创建好了主键和外键自动那个就是索引,不需要额外声明)
②一表超过300行记录,必须要有索引,否则数据库会遍历表的所有数据
③互相之间有关联的表,在这个关联字段上一定要设置索引
④唯一性太差的字段,不适合设置索引
⑤更新太频繁的字段不适合做索引
⑥经常被where条件匹配的字段,尤其是表数据多的,应该创建索引
⑦在经常进行group by(分组语句)、order by(排序语句)的字段上要建立索引
⑧索引的列的字段越小越好,长文本的字段不适合建立索引
索引的类型
①B-树(BTREE)
树形结构索引,也是大部分数据库的默认类型
根节点:树的最顶端的分支节点
分支节点:指向索引里其他的分支节点或者叶子节点
叶子节点:指向表里的数据行
创建索引
②哈希索引
散列索引 把任意长度的输入,通过散列算法变换成固定长度的输出。散列值分别对应数据里的行和列
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
联合索引
指定一个索引名下有多个列名(组合索引)
联合索引,查询时必须按照穿件时的顺序来进行查询
范围查询,有可能右侧的索引会失效
where is not null 数据多数不为空,索引失效
索引
普通索引
主键索引
唯一索引
全文索引
联合索引
创建索引时,注意索引失效的情况(最前面加个explain)
explain select * from try where age > 12 and address = '1';
面试:一张表的查询速度是7.62s,怎么加快查询速度?排查思路?
答:①先查缓存,看是不是请求直接到了后端数据库。
②再看索引,请求的列值不是默认的索引,添加一下即可。explain