后端开发【一大波有用知识】MySQL索引原理(索引、约束、索引实现、索引失效、索引原则)以及SQL优化

本文详细介绍了MySQL的索引类型,包括主键、唯一、普通、组合和全文索引,强调了主键选择和B+树在索引实现中的重要性。此外,还探讨了索引失效的情况和优化SQL的方法,如避免全表扫描、使用覆盖索引和遵循最左匹配原则。最后提到了优化SQL的工具,如EXPLAIN和慢查询日志分析。

一、索引

索引分类:主键索引、唯一索引、普通索引、组合索引、以及全文索引(elasticsearch)

主键索引

非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息

PRIMARY KEY(key)

唯一索引

不可以出现相同的值,可以有NULL值

UNIQUE(key)

主键索引和唯一索引的差别:

唯一索引可以有一个NULL值,只要整体不重复就行了。而主键索引,是非空唯一索引。

普通索引

允许出现相同的索引内容

INDEX(key)
-- OR
KEY(key[,...])

组合索引

对表上的多个列进行索引

INDEX idx(key1,key2[,...]);
UNIQUE(key1,key2[,...]);
PRIMARY KEY(key1,key2[,...]);

比如有(key1,key2,key3)这个组合索引

先比较key1,如果key1相等再就比较key2,…

其他是合单个 索引是类似的。非叶子节点,就存储 组合索引(3个值),叶子节点存储(3个值+数据/主键索引)

​全文索引

将存储在数据库当中的整本书和整篇文章中的任意内容信息查找出来的技术;关键词 FULLTEXT; 在短字符串中用 LIKE %

在全文索引中用 match 和 against

也就是说,全文索引通过关键字,可以将整篇文章给搜索出来

主键选择

innodb 中表是索引组织表,每张表有且仅有一个主键;

如果显示设置 PRIMARY KEY ,则该设置的key为该表的主键;

如果没有显示设置,则从非空唯一索引中选择;

只有一个非空唯一索引,则选择该索引为主键;

有多个非空唯一索引,则选择声明的第一个为主键;

没有非空唯一索引,则自动生成一个 6 字节的 _rowid 作为主键; 所有的索引都会创建一个B+树,用key值,来保证有序。

二、约束

为了实现数据的完整性,对于innodb,提供了以下几种约束,primary key,unique key,

foreign key, default, not null

外键约束(事务性)

外键用来关联两个表,来保证参照完整性;MyISAM存储引擎本身并不支持外键,只起到注释作用;而innodb完整支持外键;

create table parent (
id int not null,
primary key(id)
) engine=innodb;
create table child (
id int,
parent_id int,
foreign key(parent_id) references parent(id) ON DELETE CASCADE ON UPDATE
CASCADE
) engine=innodb;
-- 被引用的表为父表,引用的表称为子表;
-- 外键定义时,可以设置行为 ON DELETE 和 ON UPDATE,行为发生时的操作可选择:
-- CASCADE 子表做同样的行为
-- SET NULL 更新子表相应字段为 NULL
-- NO ACTION 父类做相应行为报错
-- RESTRICT 同 NO ACTION
INSERT INTO parent VALUES (1);
INSERT INTO parent VALUES (2);
INSERT INTO child VALUES (10, 1);
INSERT INTO child VALUES (20, 2);
DELETE FROM parent WHERE id = 1;

外键在项目中不推荐使用。外键是为了保证数据的完整性,当这张表中数据删除的时候,外键关联的另一张也要删除这一行,这个事务由我们自己去定义实现。

比如下图中,DELETE代表删除,CASCADE表示和父表做同样的行为,当前父表中删除这行,子表也会删除,因此外键是具备事务性的。

外键不建议使用的原因:要实现父表删除某行,通过外键关联事务,子表对应行也要进行删除。但是后来参与项目的人可能对事务联动不了解,进行了重复的删除,会导致bug。因此建议在项目中,删除父表某行,如果子表某行也想进行相应删除,那就进行手动写,(删除子表某行的)删除语句。

比如下图中,父表中删除id=1的行,子表中也会删除。

​当不适用外键关联时,最后一句删除SQL可以等效为下面两句

DELETE FROM parent WHERE id = 1;

DELETE FROM child where parent_id=1;

约束与索引的区别

创建主键索引或者唯一索引的时候同时创建了相应的约束;但是约束时逻辑上的概念;索引是一个

数据结构既包含逻辑的概念也包含物理的存储方式;

三、索引实现

索引实现

innodb由段、区、页组成;段分为数据段、索引段、回滚段等;区大小为 1 MB(一个区由64个

连续页构成);页的默认值为16k;页为逻辑页,磁盘物理页大小一般为 4K 或者 8K;为了保证区

中的页的连续,存储引擎一般一次从磁盘中申请 4~5 个区;

表空间–>段空间–>区–>页–>行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值