Mysql索引基本概念及案例总结(含索引的使用注意事项)

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql索引基本概念及案例总结(含索引的使用注意事项)相关的知识,希望对你有一定的参考价值。

Mysql索引基本概念及案例总结

键(Key)与索引(Index)关键字的区别

索引是键的列表,当我们定义一个key(外键除外,一般是PRIMARY KEY或者KEY形式)时就会产生对应的索引。一般情况下KEY和INDEX关键字可以互换。

唯一索引的说明

唯一索引是只允许索引中每个值只能对应一行的索引。这里唯一分两层含义,在用户层对应唯一约束,即不能将重复的值插入定义为唯一的字段里,而对于数据库而言唯一性对应的是唯一索引检查字段的不重复性。

特别的:对于字段允许为NULL的唯一索引,NULL可以多次插入进去,而不被认为是重复的数据。

主键Primary Key的说明

唯一表的主键是定义行唯一性的索引,对于主键而言,NULL值是不被允许的,即它不能插入到定义为主键的字段里。实际上表里任意定义为Unique索引的列就可以作为表的主键,但一般选择其中不经常变的字段。

在InnoDB里主键有特殊的用途,在数据库复制时通过主键可以检测到每一行变化时的时间戳。在组复制(GROUP Replication)时一般明确要求表有主键或者有唯一索引。

sql_require_primary_key选项是强制表有主键,默认时没有这个要求(即表必须得有主键)。

次(辅助)索引Secondary Indexes的说明

辅助索引是相对于主键而言的,除主键之外的唯一索引或者普通索引都叫做辅助索引。

聚集索引

在InnoDB里将行数据存储于B树索引(B-tree)的叶子页内的索引叫做聚集索引。因为索引的值聚集在一起,所有有了聚集索引这个名字。主键就是用于做聚集索引的。特别的,如果没有给表设定主键,那么InnoD引擎会找唯一不为NULL值的索引作为“主键”。如果还是找不到,那么InnoD引擎会加一个隐藏的6字节自增整数,该值相对于InnoD引擎里的所有表都是唯一的。

覆盖索引

覆盖索引又称之为索引的命中,即可我们给出的查询里所有的字段都被索引覆盖(命中)。比如一个查询:

SELECT deptno,deptname
FROM dept
-- 这里的两个字段deptno和deptname都能通过某个索引查询的到,则成为索引命中。

这里的两个字段deptno和deptname都能通过某个索引查询的到,则成为索引命中。

索引的限制

  1. 在数据库页大小是16k时,B-tree索引的最大宽度(索引字段里定义的长度)为3072字节(DYNAMIC、COMPRESSED)、767字节(REDUNDANT 、 COMPACT),其中DYNAMIC、COMPRESSED、REDUNDANT 、 COMPACT是InnoDB里的4中行格式。同理如果当前数据库页为8k则DYNAMIC、COMPRESSED行格式下索引最大为1536字节。
  2. 当指定了索引字段的长度时,Blob或者Text只能在非全文索引的索引中使用。
  3. 一个表只能对1017个字段设置功能键(唯一、外键等)。
  4. 一个表只能有64个辅助索引。
  5. 一个表设置复合索引或功能键时最多只能包含16个字段。

关于行格式:表的行格式决定了记录行是物理存储的形式,同时它也影响到查询以及数据操作时的效率。如果更多的行填充到磁盘页里,那么查询或者索引查找时将更快,数据缓存池里将使用更少缓存,同时也会有更少的I/O读写操作。

常见的行格式有:REDUNDANT, COMPACT, DYNAMIC, and COMPRESSED.

行格式

压缩存储特点

增强的变长列存储

大索引键前缀支持

压力支持

支持的表空间类型

REDUNDANT

system, file-per-table, general

COMPACT

system, file-per-table, general

DYNAMIC

system, file-per-table, general

COMPRESSED

file-per-table, general

详细可见:MySQL :: MySQL 8.0 Reference Manual :: 15.10 InnoDB Row Formats

https://dev.mysql.com/doc/refman/8.0/en/create-index.htmlhttps://dev.mysql.com/doc/refman/8.0/en/create-index.html

代码验证

创建表时指定索引

CREATE TABLE people (
id int unsigned NOT NULL,
name varchar(50),
birthdate date NOT NULL,
location point NOT NULL SRID 4326,
description text,
PRIMARY KEY (id),
INDEX (name),
SPATIAL INDEX (location),
FULLTEXT INDEX (description)
);

注:

  1. 创建表时指定了唯一索引。
  2. 指定了Name字段的辅助索引。
  3. 指定以Location字段对应的坐标索引。
  4. 指定了文本(text)类型的Description字段对应的全文索引。

以上是关于Mysql索引基本概念及案例总结(含索引的使用注意事项)的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch_基本概念及索引过程

数据库基础:讲解MySQL索引的概念及数据库索引的应用[1]

Lucene基本概念及使用

MySQL 索引 与 事务

MySQL高级篇——索引视图存储过程和函数触发器的相关概念及操作

Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)