MySQL的索引十问十答

前言:

最近,来到新的工作岗位,时间和精力几乎都放到理解新的业务与熟悉相关技术栈上面,没有过多的时间去系统学习和总结知识。但是,我希望我每周还是可以更新一篇文章。虽然说没有很多的时间去系统学习,但原来的一些相关总结,还是可以为大家分享一下。今天,我就给大家说一说,我对MySQL索引的一些理解。

正文:

Q&A1:什么是索引?

它是对数据库表中一个或多个列的值进行排序的数据结构。它是一个文件,占用物理空间。

Q&A2:索引的优缺点是什么?

优点:加快检索速度加速表和表之间的连接;创建唯一性索引,保证表中每一行数据的唯一性

缺点:占用物理存储空间创建索引和维护索引花费时间

Q&A3:索引的类型有哪些?

聚集索引与非聚集索引(又称辅助索引)

  • 聚集索引:

概念:数据行的物理顺序与列值(一般是主键)的逻辑顺序相同,一个表中只能拥有一个聚集索引(它既存储了索引,也存储了行值)。聚集索引的叶子节点就是对应的数据节点,不需要二次查询,查询速度占优势。

举例:新华字典的拼音字典。

MySQL的索引十问十答_第1张图片

  • 非聚集索引:

概念:索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。非聚集索引的叶节点仍然是索引节点,只是有一个指针指向对应的数据块,如果没有 ,需要第二次的查询。

举例:新华字典的偏旁字典

MySQL的索引十问十答_第2张图片

非聚集索引分类:

普通索引(Normal):基本的索引类型,没有任何限制(允许有空值)。

唯一索引(Unique):索引列的值唯一,但允许有空值。如果是组合索引,组合列的值要唯一。

全文索引(Full Text):主要针对文本的内容进行分词,加快查询速度。

Q&A4:索引方法有哪些?

Hash索引(仅Memory引擎支持)和B-Tree索引

Hash索引与B-Tres索引区别:

Hash索引比B-Tree索引效率高,但是Hash 索引数据结构的特殊性带来了很多限制(弊端);

Hash仅能满足"=","IN"和"<=>"查询,不能使用范围查询;而B-Tree都可以;

Hash不能来加速 ORDER BY 操作;而B-Tree可以;

Hash使用联合索引时,只能全键查找记录;而 B-tree可以使用最左匹配规则查找记录;

Hash 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

Q&A5:索引的使用场景有哪些?

  • 使用场景:

where后面的列;主键和外键的列;经常需要排序、分组和联合操作的字段。

  • 不使用场景:

查询中很少使用的字段;数据量太少的字段;唯一性不太差的字段;更新频繁的字段;不会出现在where后的字段;大字段(text和blob等)不适合建立索引。

Q&A6:主键索引与普通索引的区别?

主键索引(即,聚集索引)的叶子结点存放了整行记录;普通索引(即,非聚集索引)的叶子结点存放了主键ID,查询的时,需要回表查询,但索引覆盖时,不需要回表查询(这是InnoDB中的区别)

Q&A7:索引和主键的区别?

  • 举例:

主键:书的页码相当于主键;

索引:书的目录相当于索引。

  • 区别:

本质不一样:主键是一种约束,索引一种数据结构,详见《索引与约束的区别?》;

主键可以作为外键,唯一索引不行;

主键的列不允许空值,唯一索引的列允许空值;

一个表只能有一个主键,但可以多个唯一索引;

主键创建后一定包含一个唯一索引,唯一索引并不一定就是主键;

Q&A8:主键是加了唯一性约束的聚集索引吗?

不是,主键是一种约束,索引一种数据结构,本质不一样。如果表中定义了主键,那么主键可以作为聚集索引。

Ext:

在InnoDB中,如果表中定义一个主键,主键作为聚集索引;如果没有定义主键,表中的第一个唯一非空索引被作为聚集索引;如果连唯一索引都没有,会内部生成一个隐藏的主键作为聚集索引(隐藏的主键是6个字节的列)。

Q&A9:索引与约束的区别?

约束是一个逻辑的概念,用来保证数据的完整性;而索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物理存储的方式。

Tips

关系型数据库(MySQL)本身就能够保证数据完整性。

数据完整性三种形式:

实体完整性:保证表中有一个主键(通过Primary Key或Unique Key约束,也可以编写一个触发器)。

域完整性:保证数据每列的值满足特定条件(选择合适的数据类型、外键约束、触发器、DEAFAULT约束)。

参照完整性:保证两张表之间的关系(通过外键或者触发器)。

Q&A10:什么是覆盖索引?

一般会根据查询的where条件来创建合适的索引,但是优秀的索引设计应该考虑到整个查询。其实MySQL可以使用索引来直接获取列的数据。如果索引的叶子节点包含了要查询的数据,那么就不用再回表查询,也就是说这种索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。

Q&A11:MySQL 8.0版本的倒序索引(新增):

使用倒序索引(INDEX DESC),可以大幅提升带有order by desc子句的SQL语句性能。

语法如下:

红框内:默认是ASC(可以不写),即正序索引,DESC是倒序索引。

 

 

你可能感兴趣的:(MySQL的索引十问十答)