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都能通过某个索引查询的到,则成为索引命中。
索引的限制
- 在数据库页大小是16k时,B-tree索引的最大宽度(索引字段里定义的长度)为3072字节(DYNAMIC、COMPRESSED)、767字节(REDUNDANT 、 COMPACT),其中DYNAMIC、COMPRESSED、REDUNDANT 、 COMPACT是InnoDB里的4中行格式。同理如果当前数据库页为8k则DYNAMIC、COMPRESSED行格式下索引最大为1536字节。
- 当指定了索引字段的长度时,Blob或者Text只能在非全文索引的索引中使用。
- 一个表只能对1017个字段设置功能键(唯一、外键等)。
- 一个表只能有64个辅助索引。
- 一个表设置复合索引或功能键时最多只能包含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)
);
注:
- 创建表时指定了唯一索引。
- 指定了Name字段的辅助索引。
- 指定以Location字段对应的坐标索引。
- 指定了文本(text)类型的Description字段对应的全文索引。
以上是关于Mysql索引基本概念及案例总结(含索引的使用注意事项)的主要内容,如果未能解决你的问题,请参考以下文章
数据库基础:讲解MySQL索引的概念及数据库索引的应用[1]